Passer au contenu principal

logoCorrectSize.png

Adaptive Insights French

Faire des demandes d’API Adaptive Planning avec les informations d’identification Workday

Décrit comment effectuer des demandes d’API Adaptive Planning avec les informations d’identification Workday

Some links in this article go to the Workday community. If you don't have a community account, request one.

Les utilisateurs synchronisés avec Workday qui se connectent à Workday et utilisent le Worklet Adaptive Planning peuvent exécuter des API publiques Adaptive Planning.  Les utilisateurs doivent créer une ISU spécifiquement pour effectuer ces demandes d’API. Ces utilisateurs doivent fournir un jeton dans l’élément d’informations d’identification des demandes d’APIAdaptive Planning au lieu d’un nom d’utilisateur et d’un mot de passe. Vous pouvez mettre ce jeton en cache et l’utiliser jusqu’à ce qu’il expire. Une fois qu’il a expiré, vous devez obtenir un nouveau jeton.

Before You Begin

Domaine et groupes de sécurité Workday

  •  Vérifiez que les utilisateurs ISU qui ont besoin d’un accès API font partie de la configuration : Domaine de sécurité Accès à l’API Adaptive Planning.

Tâches de configuration de Workday

  • Vérifiez que les tâches  Authentification unique sont activées dans l’onglet Connexion utilisateur de l’onglet Adaptive Planning.
  • Vérifiez que la tâche Configuration de l’API publique est activée dans l’onglet API publique de l’onglet Adaptive Planning.
  • Vérifiez qu’une tâche de configuration d’un utilisateur du système d’intégration (ISU) a créé une ISU spécifiquement pour effectuer des demandes d’API Adaptive Planning de Workday et l’a mappée à un compte utilisateur Adaptive Planning.

Admin utilisateur Adaptive Planning

  • Vérifiez que vous voyez l’ISU commencer par PublicAPIISU_  dans la liste des utilisateurs dans Administration > Utilisateurs.
  • Vérifiez que cet utilisateur dispose du niveau d’accès nécessaire pour les API qu’il souhaite exécuter. Les nouvelles ISU ne reçoivent pas d’accès de niveau par défaut.

Basic Steps

  1. Obtenez un certificat et extrayez votre clé publique.
  2. Enregistrez un client API dans Workday avec ce certificat.
  3. Générez un jeton JWT, Retrieve Workday access_token et Retrieve AdaptiveAPIAccessToken.
  4. Utilisez AdaptiveAPIAccessToken dans une demande d’API Adaptive Planning.

Obtenir un certificat et extraire votre clé publique

Vous pouvez créer vous-même un certificat ou acheter un certificat auprès d’une autorité de certification bien connue. Pour plus de détails sur les paramètres nécessaires pour votre certificat X.509 dans Workday, voir Concept : Certificats X.509 dans Workday.

  1. Extrayez la clé publique de votre certificat pour la télécharger dans Workday.
  2. Conservez votre clé privée pour l’utiliser dans votre application d’appel.
  3. Collez le certificat dans Workday lorsque vous enregistrez votre jeton Bearer JWT. Référencez votre clé privée dans votre script.

Voir OAuth avec JWT (jeton JSON Web) et Accéder aux points de terminaison externes.

Enregistrer un client API Workday

  1. Enregistrer un client API avec le type d’octroi de client : Jwt Bearer Grant dans Workday. Pour plus d’informations, consultez Enregistrer un client d’API.
  2. Copiez la clé publique dérivée de votre certificat dans le certificat x.509 sur la page Enregistrer le client API dans Workday.
  3. Pour Portée (Domaine fonctionnel), sélectionnez Adaptive Planning.
  4. Pour l’URL de redirection, saisissez https://workday.com
  5. Lorsque vous avez terminé d’enregistrer le client d’API, copiez les champs résultants en bas de la page dans un fichier texte à utiliser ultérieurement.
    • Point terminal de l’API REST Workday
    • Point terminal de jeton
    • Point terminal d’autorisation

Générez un jeton JWT, Retrieve Workday access_token et Retrieve AdaptiveAPIAccessToken

  1. Utilisez votre clé privée et générez le jeton JWT en exécutant le pseudo-code répertorié ci-dessous.
  2. Pour récupérer un jeton d’accès Workday, effectuez une demande POST au point terminal du jeton, en transmettant grant_type et assertion. Utilisez le point terminal de jeton copié après avoir enregistré votre client API dans Workday.

    Exemple de point terminal de jeton :
https://i-0b73e720dd1d2a041.workdaysuv.com/ccx/oauth2/super/token

     Exemple de demande CURL au point terminal de jeton

curl --request POST 'https://i-0b73e720dd1d2a041.workdaysuv.com/ccx/oauth2/super/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}}'
  1. Récupérez AdaptiveAPIAccessToken en appelant le point terminal Workday à l’aide du jeton d’accès Workday. Utilisez la valeur access_token précédente comme jeton Bearer dans l’en-tête Auth pour ce GET.
    Exemple de jeton d’accès :
https://i-0b73e720dd1d2a041.workdaysuv.com/ccx/api/planning/v1/super/adaptiveAPIAccessToken

   Exemple de demande CURL pour AdaptiveAPIAccessToken :

 curl --request GET 'https://i-0b73e720dd1d2a041.workdaysuv.com/ccx/api/planning/v1/super/adaptiveAPIAccessToken' \--header 'Authorization: Bearer {{JWT Bearer Token access_token you get back from the Token Endpoint request in the previous step}}' \
--data-raw ''
  1. Appelez l’API Adaptive Planning à l’aide de AdaptiveAPIAccessToken dans l’élément d’informations d’identification du XML dans un HTTP POST
    Exemple :
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

Exemple d’application Java pour la génération d’un jeton JWT

Cet exemple d’application Java génère un jeton JWT.

//**********************************************************************
//
// File: TestPublicAPISample.java//// Copyright 2004-2019 Workday Adaptive Planning.
// Tous droits réservés
//// Ce travail contient des secrets commerciaux et des documents confidentiels de// Workday Adaptive Planning et son utilisation ou sa divulgation en tout ou en partie// sans l’autorisation écrite expresse de Workday Adaptive Planning est interdite.////**********************************************************************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 "";        }    }

Exemple d’application C# pour la génération d’un jeton JWT

Cet exemple d’application C# génère un jeton JWT qui remplace le nom d’utilisateur et le mot de passe dans l’élément d’informations d’identification d’une demande d’API Adaptive Planning.

Cet exemple de code nécessite une page NuGet.
Package NuGet requis :  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);

Utilisez AdaptiveAPIAccessToken dans une demande d’API Adaptive Planning

Une fois que vous avez configuré Workday pour l’accès API Adaptive Planning public, l’élément d’informations d’identification des demandes d’API Adaptive Planning utilise AdaptiveAPIAccessToken au lieu d’un nom d’utilisateur et d’un mot de passe. L’authentification de base avec nom d’utilisateur et mot de passe ne fonctionnera pas. Pour plus d’informations, voir API REST Adaptive Planning et Méthodes d’API.

Exemple d’AdaptiveAPIAccessToken dans une demande d’API Adaptive Planning

<?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>

 

  • Cet article vous a été utile ?