メインコンテンツまでスキップ

logoCorrectSize.png

Workday Adaptive Planning Knowledge Center

Workday 認証情報を使用した Adaptive Planning API リクエストの作成

Workday 認証情報を使用して Adaptive Planning API リクエストを作成する方法について説明します

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

Workday にログオンし、Adaptive Planningワークレットを使用する Workday 同期ユーザは、Adaptive Planningパブリック API を実行できます。ユーザは、これらの API リクエストを行うために、特に ISU を作成する必要があります。これらのユーザは、ユーザ名とパスワードの代わりに、API リクエストの認証情報要素Adaptive Planningにトークンを提供する必要があります。このトークンをキャッシュし、有効期限が切れるまで使用することができます。有効期限が切れたら、新しいトークンを取得する必要があります。

Before You Begin

Workday ドメインとセキュリティグループ

  • API アクセスを必要とする ISU ユーザがセットアップ Adaptive Planning API Access セキュリティドメインの一部であることを確認します。

Workday セットアップタスク

  • Adaptive Planningタブの [ユーザ サインオン] タブで、シングル サインオンタスクが有効になっていることを確認します。
  • Adaptive Planningタブの [パブリック API] タブで パブリック API セットアップタスクが有効になっていることを確認します。
  • W統合システムユーザ (ISU) 設定タスクが特定の Workday Adaptive Planning API リクエストを作成する ISU を作成し、それをAdaptive Planningユーザアカウントにマッピングしたことを検証します。

Adaptive Planningユーザ管理

  • [管理] > [ユーザ] 内のユーザリストに PublicAPIISU_ で始まる ISU が表示されていることを確認します。
  • このユーザが実行する API に必要な組織のアクセス権を持っていることを確認します。新しい ISU は、デフォルトでは組織のアクセス権を受取ません。

Basic Steps

  1. 証明書を取得し、公開キーを抽出します。
  2. その証明書を使用して、Workday に API クライアントを登録します。
  3. JWT トークンの生成、Workday access_token の取得、および AdaptiveAPIAccessToken の取得。
  4. Adaptive Planningの API リクエストで AdaptiveAPIAccessToken を使用します。

証明書の取得と公開キーの抽出

証明書は自分で作成することも、よく知られた認証機関から購入することもできます。Workday の X.509 証明書に必要なパラメータの詳細については、概念: Workday の X.509 証明書を参照してください。

  1. Workday にアップロードする証明書から公開キーを抽出します。
  2. 秘密キーは、呼び出しアプリケーションで使用するため、保管しておいてください。
  3. JWT Bearer トークンを登録するときに、証明書を Workday に貼り付けます。スクリプト内の秘密キーを参照します。

JWT (ジェイソンウェブトークン) による OAuth」と「外部エンドポイントへのアクセス」を参照してください。

Workday API クライアントを登録する

  1. クライアント権限タイプ: JWT Bearer 付与で Workday に API クライアントを登録します。詳細については「API クライアントの登録」を参照してください。
  2. 証明書用に生成した公開キーを、Workday の [API クライアントの登録] ページの x.509 証明書にコピーします。
  3. [スコープ (機能領域)] には、Adaptive Planningを選択します。
  4. リダイレクト URL は https://workday.com を入力します。
  5. API クライアントの登録が完了したら、ページの下部にある結果のフィールドを、後で使用できるようにテキストファイルにコピーします。
    • Workday REST API エンドポイント
    • トークンエンドポイント
    • 承認エンドポイント

JWT トークンの生成、Workday access_token の取得、および AdaptiveAPIAccessToken の取得

  1. 以下のリストの疑似コードを実行し、秘密キーを使用して JWT トークンを生成します。
  2. Workday アクセストークンを取得するには、トークンエンドポイントに POST リクエストを行い、grant_typeアサーションを渡します。API クライアントを Workday に登録した後、コピーしたトークンエンドポイントを使用してください。

    トークンエンドポイントの例:
https://i-0b73e720dd1d2a041.workdaysuv.com/ccx/oauth2/super/token

トークンエンドポイントへの CURL リクエストの例

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. Workday アクセストークンを使用し Workday エンドポイントを呼び出して、AdaptiveAPIAccessToken を取得します。以前の access_token 値を Bearer トークンとして、この GETAuth ヘッダに使用します。
    アクセストークンの例:
https://i-0b73e720dd1d2a041.workdaysuv.com/ccx/api/planning/v1/super/adaptiveAPIAccessToken

AdaptiveAPIAccessTokenCURL リクエストの例:

 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. HTTP POST の XML 認証情報要素に含まれる AdaptiveAPIAccessToken を使用して、Adaptive PlanningAPI を呼び出します。
    例:
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

JWT トークン生成用の Java アプリケーション例

このサンプル Java アプリケーションは、JWT トークンを生成します。

//**********************************************************************//// File: TestPublicAPISample.java//// Copyright 2004-2019 Workday Adaptive Planning. // All Rights Reserved. //// この著作物には、// Workday Adaptive Planning の企業秘密および機密資料が含まれており、Workday Adaptive Planning の明示的な書面による許可なしに、その全体または一部を使用または開示することは禁じられています。/////**********************************************************************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 "";        }    }

JWT トークン生成用サンプル C# アプリケーション

このサンプル C# アプリケーションは、Adaptive PlanningAPI リクエストの認証情報要素のユーザ名とパスワードを置き換える JWT トークンを生成します。

このサンプルコードには NuGet ページが必要です。
必須の NuGet パッケージ: 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);

Adaptive PlanningAPI リクエストで AdaptiveAPIAccessToken を使用する

Workday をAdaptive Planning公開 API アクセスに設定すると、Adaptive PlanningAPI リクエストの認証情報要素は、ユーザ名とパスワードの代わりに AdaptiveAPIAccessToken を使用します。ユーザ名とパスワードを使用した基本認証は機能しません。詳細については「Adaptive Planning REST API」と「API メソッド」を参照してください。

Adaptive PlanningAPI リクエストにおける AdaptiveAPIAccessToken の例

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

 

  • この記事は役に立ちましたか?