Realización de solicitudes de API de Adaptive Planning con credenciales de Workday
Algunos vínculos de este artículo redirigen a Workday Community. Si no tiene una cuenta de Workday Community, solicítela.
Usuarios sincronizados con Workday que inician sesión en Workday y utilizan
Adaptive Planning
El worklet puede ejecutarse Adaptive Planning
API públicas Los usuarios deben crear un ISU específicamente para realizar estas solicitudes de API. Estos usuarios deben proporcionar un token en el credentials
elemento de Adaptive Planning
Solicitudes de API en lugar de un nombre de usuario y una contraseña. Puede almacenar en caché este token y usarlo hasta que caduque. Una vez caducado, debe obtener un nuevo token.
Requisitos previos
Requisitos previos
Dominio y grupos de seguridad de Workday
- Verifique que los usuarios de ISU que necesitan acceso a la API formen parte del dominio de seguridadSet Up: Adaptive Planning API Access.
Tareas de definición de Workday
- Verifique que las tareasde inicio de sesión únicoestén activadas en la fichaInicio de sesión de usuarioen elAdaptive Planningficha
- Verifique que la tareade configuración API públicaesté activada en la fichaAPI públicade laAdaptive Planningficha
- Verifique que una tarea de definición de usuario de sistema de integración (ISU) haya creado un ISU específicamente para realizar solicitudes de API de Workday Adaptive Planning y lo haya asignado a unAdaptive Planningcuenta de usuario
Adaptive Planning
Administrador de usuarios- Verifique que vea el ISU que comienza conPublicAPIISU_en la lista de usuarios dentro de Administración > Usuarios.
- Verifique que este usuario tenga el nivel de acceso necesario para las API que desea ejecutar. Los nuevos ISU no reciben acceso de nivel por defecto.
Pasos
Pasos
- Obtenga un certificado y extraiga su clave pública.
- Registre un cliente API en Workday con ese certificado.
- Genere un token JWT, recupere Workday access_token y recupere AdaptiveAPIAccessToken.
- Utilizar AdaptiveAPIAccessToken en unaAdaptive PlanningSolicitud de API
Obtención de un certificado y extracción de su clave pública
Puede crear un certificado usted mismo o adquirir uno de una entidad emisora de certificados conocida. Para obtener más información sobre los parámetros necesarios para su certificado X.509 en Workday, consulte Concepto: certificados X.509 en Workday.
- Extraiga la clave pública de su certificado para cargarla en Workday.
- Conserve su clave privada para usarla en su aplicación de llamada.
- Pegue el certificado en Workday al registrar su token de portador JWT. Haga referencia a su clave privada en su secuencia de comandos.
Registro de un cliente API de Workday
- Registre un cliente API conClient Grant Type: Jwt Bearer Granten Workday. Consulte Registro de un cliente API para obtener más información.
- Copie la clave pública derivada de su certificado en elCertificado x.509en la página Register API Client de Workday.
- EnÁmbito (área funcional),seleccione.Adaptive Planning
- Cuando termine de registrar el cliente API, copie los campos resultantes en la parte inferior de la página en un archivo de texto para utilizarlos más tarde.
- Punto final de API de REST de Workday
- Punto final de token
- Punto final de autorización
Generate JWT Token, Retrieve Workday access_token y Retrieve AdaptiveAPIAccessToken
- Utilice su clave privada y genere el token JWT ejecutando el pseudocódigo que se indica a continuación.
- Para recuperar una credencial de acceso de Workday, realice unaPOSTsolicitud al punto final de token, pasandogrant_typeyassertion. Utilice el Token Endpoint copiado después de registrar su cliente de API en Workday. Punto final de token de ejemplo:https://{host or gateway}/ccx/oauth2/{tenant}/tokenEjemploCURLsolicitud al punto final de 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 AdaptiveAPIAccessToken llamando al punto final de Workday mediante el token de acceso de Workday. Utilizar la anterioraccess_tokenvalor como el token de portador en elAuthcabecera para estoGET.Token de acceso de ejemplo:https://{host or gateway}/ccx/api/planning/v1/{tenant}/adaptiveAPIAccessTokenEjemploCURLsolicitud de AdaptiveAPIAccessToken:curl --request GET 'https://{host or gateway}/ccx/api/planning/v1/{tenant}/adaptiveAPIAccessToken' \ --header 'Authorization: Bearer {{the prior access_token value}}' \ --data-raw ''
- Llame alAdaptive PlanningAPI que utiliza AdaptiveAPIAccessToken en el elemento de credenciales del XML en un HTTPPOST. Ejemplo: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
Aplicación Java de muestra para generar una señal JWT
Esta aplicación Java de muestra genera una señal 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 ""; } }
Aplicación de C# de muestra para generar un token JWT
Esta aplicación C# de muestra genera un token JWT que sustituye al nombre de usuario y la contraseña en el elemento de credenciales de un
Adaptive Planning
Solicitud de APIEste código de muestra requiere una página NuGet. Paquete NuGet obligatorio:
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);
Utilizar AdaptiveAPIAccessToken en una Adaptive Planning Solicitud de API
Adaptive Planning
Solicitud de APIUna vez que haya configurado Workday para
Adaptive Planning
acceso público a la API, el elemento de credenciales de Adaptive Planning
Las solicitudes de API utilizan AdaptiveAPIAccessToken en lugar de un nombre de usuario y una contraseña. La autenticación básica con nombre de usuario y contraseña no funcionará. Consulte API de REST de Adaptive Planning y Métodos de API para obtener más información.Ejemplo de AdaptiveAPIAccessToken en un Adaptive Planning Solicitud de API
Adaptive Planning
Solicitud 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>