Fazer solicitações de API do Adaptive Planning com credenciais do Workday
Alguns links neste artigo levam para o Workday Community. Se você não tem uma conta do Community, solicite uma.
Usuários sincronizados com o Workday que se conectam ao Workday e usam o
Adaptive Planning
O worklet pode ser executado Adaptive Planning
APIs públicas. Os usuários devem criar um ISU especificamente para fazer essas solicitações de API. Esses usuários devem fornecer um token no credentials
elemento de Adaptive Planning
Solicitações de API em vez de nome de usuário e senha. Você pode armazenar esse token em cache e usá-lo até que expire. Depois que ele expira, você deve obter um novo token.
Pré-requisitos
Pré-requisitos
Domínio e grupos de segurança do Workday
- Verifique se os usuários ISU que precisam de acesso à API fazem parte do domínio de segurançaSet Up: Adaptive Planning API Access.
Tarefas de definição do Workday
- Verifique se as tarefasde autenticação únicaestão habilitadas na guiaAutenticação de usuárionoAdaptive Planningguia.
- Verifique se a tarefade definição de API públicaestá habilitada na guiaAPI públicanoAdaptive Planningguia.
- Verifique se uma tarefa de definição de usuário de sistema de integração (ISU) criou um ISU especificamente para fazer solicitações de API do Workday Adaptive Planning e o mapeou para umAdaptive Planningconta de usuário.
Adaptive Planning
Administrador de usuários- Verifique se o ISU começa comPublicAPIISU_na lista de usuários em Administração > Usuários.
- Verifique se esse usuário tem o acesso ao nível necessário para as APIs que quer executar. Os novos ISUs não recebem acesso ao nível por padrão.
Etapas
Etapas
- Obtenha um certificado e extraia sua chave pública.
- Registre um cliente de API no Workday com esse certificado.
- Gerar um token JWT, recuperar acesso_token do Workday e recuperar AdaptiveAPIAccessToken.
- Use o AdaptiveAPIAccessToken em umAdaptive PlanningSolicitação de API
Obter um certificado e extrair sua chave pública
Você mesmo pode criar um certificado ou comprar um certificado de uma autoridade de certificação conhecida. Para obter detalhes sobre os parâmetros necessários para seu certificado X.509 no Workday, consulte Conceito: certificados X.509 no Workday.
- Extraia a chave pública do seu certificado para carregá-la no Workday.
- Mantenha sua chave privada para usar no aplicativo de chamada.
- Cole o certificado no Workday quando registrar seu token JWT Bearer. Faça referência à sua chave privada no script.
Registrar um cliente de API do Workday
- Registre um cliente de API como tipo de concessão do cliente: Concessão JWT Bearerno Workday. Para obter mais informações, consulte Registrar um cliente de API .
- Copie a chave pública derivada do seu certificado nocertificado x.509na página Register API Client do Workday.
- EmEscopo (área funcional),selecione.Adaptive Planning
- Quando terminar de registrar o cliente de API, copie os campos resultantes na parte inferior da página em um arquivo de texto para usar posteriormente.
- Ponto de extremidade da API REST do Workday
- Ponto de extremidade do token
- Ponto de extremidade de autorização
Gerar token JWT, recuperar access_token do Workday e recuperar AdaptiveAPIAccessToken
- Use sua chave privada e gere o token JWT executando o pseudocódigo listado abaixo.
- Para recuperar um token de acesso do Workday, faça umPOSTsolicitação ao ponto de extremidade do token, passandogrant_typeeassertion. Use o ponto de extremidade do token copiado após registrar seu cliente de API no Workday. Exemplo de ponto de extremidade de token:https://{host or gateway}/ccx/oauth2/{tenant}/tokenExemploCURLsolicitação para o ponto de extremidade do tokencurl --request POST 'https://{host or gateway}/ccx/oauth2/{tenant}/token' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer' \ --data-urlencode 'assertion={{the jwt assertion from your certificate}}'
- Recupere o AdaptiveAPIAccessToken ao chamar o ponto de extremidade do Workday usando o token de acesso do Workday. Usar o anterioraccess_tokencomo o token Bearer noAuthcabeçalho para esteGET.Exemplo de token de acesso:https://{host or gateway}/ccx/api/planning/v1/{tenant}/adaptiveAPIAccessTokenExemploCURLsolicitação para o AdaptiveAPIAccessToken:curl --request GET 'https://{host or gateway}/ccx/api/planning/v1/{tenant}/adaptiveAPIAccessToken' \ --header 'Authorization: Bearer {{the prior access_token value}}' \ --data-raw ''
- Ligue para oAdaptive PlanningAPI usando o AdaptiveAPIAccessToken no elemento de credenciais do XML em um HTTPPOST. Exemplo:curl -H "Content-Type: text/xml" -d '<?xml version='1.0' encoding='UTF-8'?><call method="exportLevels" callerName="a string that identifies your client application"><credentials token="ID eyJhbDci0iJSUzUxMiIsUmtpZCI6IdvcmtkYXlfa2V5In0.eyJpc3KiOiJXb3JrZGFZIiwiYXV0aF90aW1lIjoxNTczMTY3NjU2LBjzeXnfynnJd.bztQzBmHeTj1amnHA-r96TdrJK0MXMghUFF1KyjxqIq6ruHU63dJp3JAJn3Eche7SEcoZBVGX4wJgna106pmCqgrrVWMf13Hg_sb_szabal2XN1KEEk1qh8z1IDlbt6qJIL_xyW3J2nNSs5ima3vJUYU5sRQXwXst0GuFWXpy464GyB4oKcscrg28X3dnPO_ytdohMKHsWkqyHQKXFQwoQezFaGy10sp4RRUj0lpOZX8C9oBHDYA58IXxGkqKLJVNPvDND6rGY5fTHQ-yxpe1nz-WqB0boiq9a-dv8b3EBzbelxj2fCPdMbng6kzygDcA2at_7BNQiyzfIovS5AG"/><include versionID="3" inaccessibleValues="false"/><sheet id="3" /></call>' -X POST https://api.adaptiveplanning.com/api/v23
Exemplo de aplicativo Java para gerar um token JWT
Este aplicativo Java de amostra gera um token JWT.
//********************************************************************** // // File: TestPublicAPISample.java // // Copyright 2004-2019 Workday Adaptive Planning. // All Rights Reserved. // // This work contains trade secrets and confidential material of // Workday Adaptive Planning and its use or disclosure in whole or in part // without the express written permission of Workday Adaptive Planning is prohibited. // //********************************************************************** import java.io.FileInputStream; import java.security.KeyStore; import java.security.PrivateKey; import java.security.Signature; import java.text.MessageFormat; //import java.util.Base64; import org.apache.commons.codec.binary.Base64; public class AccessAdaptiveAPI { public static void main(String args[]) { String jwtKeyStoreFileString = "/Library/Java/JavaVirtualMachines/jdk1.8.0_172.jdk/Contents/Home/jre/lib/security/JWTkeystore.jks"; String clientIDString = "BlywNDM1NmMtZTk2Mi00NTZiTWEyZjktZWM1NGJiOGQ3Yjca"; String userIdString = "PublicAPIISU_Test"; System.out.println(GetAccessToken(clientIDString,userIdString,jwtKeyStoreFileString)); } public void callAPI() { } public String getAdaptiveAPIToken() { return ""; } public String getJWTToken(String privateKey, String username) { return ""; } public void callWorkdayAPI() { } public static String GetAccessToken(String clientId, String userId, String jwtKeyStore) { String header = "{\"alg\":\"RS256\",\"typ\":\"JWT\"}"; String claimTemplate = "'{'\"iss\": \"{0}\", \"sub\": \"{1}\", \"aud\": \"{2}\", \"exp\": \"{3}\"'}'"; try { StringBuffer token = new StringBuffer(); //Encode the JWT Header and add it to our string to sign token.append(Base64.encodeBase64URLSafeString(header.getBytes("UTF-8"))); //Separate with a period token.append("."); //Create the JWT Claims Object String[] claimArray = new String[4]; //iss claimArray[0] = clientId; //sub claimArray[1] = userId; //aud claimArray[2] = "wd"; //exp claimArray[3] = Long.toString( ( System.currentTimeMillis()/1000 ) + 300); MessageFormat claims; claims = new MessageFormat(claimTemplate); String payload = claims.format(claimArray); //Add the encoded claims object token.append(Base64.encodeBase64URLSafeString(payload.getBytes("UTF-8"))); //token.append(Base64.encodeBase64URLSafeString(payload.getBytes("UTF-8"))); //Load the private key from a keystore KeyStore keystore = KeyStore.getInstance("JKS"); keystore.load(new FileInputStream(jwtKeyStore), "Workday123!".toCharArray()); PrivateKey privateKey = (PrivateKey) keystore.getKey("Workday", "Workday123!".toCharArray()); //Sign the JWT Header + "." + JWT Claims Object Signature signature = Signature.getInstance("SHA256withRSA"); signature.initSign(privateKey); signature.update(token.toString().getBytes("UTF-8")); String signedPayload = Base64.encodeBase64URLSafeString(signature.sign()); //Separate with a period token.append("."); //Add the encoded signature token.append(signedPayload); return token.toString(); //System.out.println(token.toString()); } catch (Exception e) { e.printStackTrace(); } return ""; } }
Exemplo de aplicativo em C# para gerar um token JWT
Este aplicativo de amostra em C# gera um token JWT que substitui o nome de usuário e a senha no elemento de credenciais de um
Adaptive Planning
Solicitação de APIEste código de amostra requer uma página do NuGet. Pacote NuGet obrigatório:
System.IdentityModel.Tokens.Jwt
var clientId = "BlywNDM1NmMtZTk2Mi00NTZiTWEyZjktZWM1NGJiOGQ3Yjca";//Client ID from workday API Client var isu = "PublicAPIISU_Test"; //the ISU var timeout = (DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() / 1000 + 300).ToString(CultureInfo.InvariantCulture); var environment = "wd"; var pfxFilePath = @"C:\temp\JWTkeystore2.pfx"; var pfxPassword = "Workday123!"; var payload = new JwtPayload { {"iss", clientId}, {"sub", isu}, {"aud", environment}, {"exp", timeout }, }; var signingCredentials = new X509SigningCredentials(new X509Certificate2(pfxFilePath, pfxPassword), SecurityAlgorithms.RsaSha256); // the matching PKCS #12 file with private key var jwtHeader = new JwtHeader(signingCredentials); var secToken = new JwtSecurityToken(jwtHeader, payload); var handler = new JwtSecurityTokenHandler(); var tokenToWorkday = handler.WriteToken(secToken); Console.WriteLine(tokenToWorkday);
Use o AdaptiveAPIAccessToken em um Adaptive Planning Solicitação de API
Adaptive Planning
Solicitação de APIDepois de definir o Workday para
Adaptive Planning
acesso público à API, o elemento credenciais de Adaptive Planning
As solicitações de API usam o AdaptiveAPIAccessToken em vez de nome de usuário e senha. A autenticação básica com nome de usuário e senha não funciona. Para saber mais, consulte API REST e métodos de API do Adaptive Planning.Exemplo de AdaptiveAPIAccessToken em um Adaptive Planning Solicitação de API
Adaptive Planning
Solicitação de API<?xml version='1.0' encoding='UTF-8'?> <call method="exportLevels" callerName="a string that identifies your client application"> <credentials token="ID eyJhbDci0iJSUzUxMiIsUmtpZCI6IdvcmtkYXlfa2V5In0.eyJpc3KiOiJXb3JrZGFZIiwiYXV0aF90aW1lIjoxNTczMTY3NjU2LBjzeXnfynnJd.bztQzBmHeTj1amnHA-r96TdrJK0MXMghUFF1KyjxqIq6ruHU63dJp3JAJn3Eche7SEcoZBVGX4wJgna106pmCqgrrVWMf13Hg_sb_szabal2XN1KEEk1qh8z1IDlbt6qJIL_xyW3J2nNSs5ima3vJUYU5sRQXwXst0GuFWXpy464GyB4oKcscrg28X3dnPO_ytdohMKHsWkqyHQKXFQwoQezFaGy10sp4RRUj0lpOZX8C9oBHDYA58IXxGkqKLJVNPvDND6rGY5fTHQ-yxpe1nz-WqB0boiq9a-dv8b3EBzbelxj2fCPdMbng6kzygDcA2at_7BNQiyzfIovS5AG"/> <include versionID="3" inaccessibleValues="false"/> <sheet id="3" /> </call>