Salesforce の JWT ベアラー OAuth フローを設定する - AWS Glue

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Salesforce の JWT ベアラー OAuth フローを設定する

OAuth 2.0 JSON ウェブトークン と server-to-server の統合を有効にする方法については、Salesforce のパブリックドキュメントを参照してください。 OAuth

PEM ファイルの証明書とキーのペアの作成

PEM ファイルの証明書とキーのペアを作成する

openssl req -newkey rsa:4096 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem

JWT を使用した Salesforce 接続アプリケーションの作成

  1. Salesforce にログインし、右上の設定歯車をクリックして、セットアップ を選択します。

  2. 左側の App Manager に移動します。(プラットフォームツール > アプリケーション > App Manager)

  3. 新しい接続アプリ を選択します。

  4. アプリ名を入力し、残りは自動入力します。

  5. OAuth 設定を有効にする のチェックボックスをオンにします。

  6. コールバック URL を設定します。JWT には使用されないため、https://localhost. を使用できます。

  7. 「デジタル署名の使用」のチェックボックスをオンにします。

  8. 前に作成した cert.pem ファイルをアップロードします。

  9. 必要なアクセス許可を追加します。

    1. APIs (api) を使用してユーザーデータを管理します。

    2. カスタムアクセス許可 (custom_permissions) にアクセスします。

    3. ID URL サービス (ID、プロファイル、E メール、アドレス、電話) にアクセスします。

    4. 一意のユーザー識別子 (openid) にアクセスします。

    5. リクエストはいつでも実行します (refresh_token、オフラインアクセス)。

  10. 名前付きユーザーの Issue JSON Web Token (JWT) ベースのアクセストークンのチェックボックスをオンにします

  11. [保存] を選択します。

  12. [Continue] を選択します。

  13. [コンシューマーの詳細を管理] を選択します。

  14. コンシューマーキー (クライアント ID) をコピーします。

  15. コンシューマーシークレット (クライアントシークレット) をコピーします。

  16. [キャンセル] をクリックします。

JSON ウェブトークン (JWT) の生成

  1. キーペアを pkcs12 に変換します (プロンプトが表示されたらエクスポートパスワードを設定します)。

    openssl pkcs12 -export -in cert.pem -inkey key.pem -name jwtcert > jwtcert.p12
  2. pkcs12 から Java キーストアを作成します (プロンプトが表示されたら送信先キーストアパスワードを設定し、送信元キーストアパスワードの以前のエクスポートパスワードを指定します)。

    keytool -importkeystore -srckeystore jwtcert.p12 -destkeystore keystore.jks -srcstoretype pkcs12 -alias jwtcert
  3. keystore.jks に jwtcert エイリアスが含まれていることを確認します (プロンプトが表示されたら、以前の送信先キーストアのパスワードを入力します)。

    keytool -keystore keystore.jks -list
  4. Salesforce ドキュメントに記載されている Java クラス JWTExample を使用して、署名付きトークンを生成します。

    1. 必要に応じて claimArray の値を編集します。

      • claimArray [0] = クライアント ID

      • claimArray [1] = salesforce ユーザー ID

      • claimArray [2] = salesforce ログイン URL

      • claimArray [4] = エポックからのミリ秒単位の有効期限。3660624000000 は 2085-12-31 です。

    2. path/to/keystore を keystore.jks への正しいパスに置き換えます。

    3. keystorepassword を、入力した送信先キーストアパスワードに置き換えます。

    4. privatekeypassword を、入力したソースキーストアのパスワードに置き換えます。

    5. コードをコンパイルします。このコードは、base64 エンコーディングの Apache Commons Codec によって異なります。

      javac -classpath ".:./commons-codec-1.16.1.jar" JWTExample.java
    6. コードを実行します。

      java -classpath ".:commons-codec-1.16.1.jar" JWTExample
  5. 接続されたアプリと JWT が作成されても、ユーザーはアプリの認証を受ける必要があります。2 つのアプローチについては、https://mannharleen.github.io/2020-03-03-salesforce-jwt/ のステップ 3 を参照してください。

上記の手順が完了したら、Salesforce からアクセストークンを取得するために使用できる JSON ウェブトークン (JWT) を出力する必要があります。

入力例

export password for pkcs12: awsglue destination keystore password for jks: awsglue source keystore password for jks: awsglue claimArray[0] = “client-id”; claimArray[1] = “my@email.com”; claimArray[2] = "https://login.salesforce.com“; claimArray[3] = "3660624000000"; path to keystore: ./keystore.jks keystore password: awsglue privatekey password: awsglue

出力例:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.signature

便利なリンク:

  • https://www.base64encode.org/

  • https://jwt.io/

  • https://help.salesforce.com/s/articleView?id=sf.remoteaccess_oauth_jwt_flow.htm

JWTExample.java

import org.apache.commons.codec.binary.Base64; import java.io.*; import java.security.*; import java.text.MessageFormat; public class JWTExample { public static void main(String[] args) { String header = "{\"alg\":\"RS256\"}"; 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[5]; claimArray[0] = "value"; claimArray[1] = "my@email.com"; claimArray[2] = "https://login.salesforce.com"; 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"))); //Load the private key from a keystore KeyStore keystore = KeyStore.getInstance("JKS"); keystore.load(new FileInputStream("./keystore.jks"), "awsglue".toCharArray()); PrivateKey privateKey = (PrivateKey) keystore.getKey("jwtcert", "awsglue".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); System.out.println(token.toString()); } catch (Exception e) { e.printStackTrace(); } } }