翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
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 接続アプリケーションの作成
Salesforce
にログインし、右上の設定歯車をクリックして、セットアップ を選択します。 左側の App Manager に移動します。(プラットフォームツール > アプリケーション > App Manager)
新しい接続アプリ を選択します。
アプリ名を入力し、残りは自動入力します。
OAuth 設定を有効にする のチェックボックスをオンにします。
コールバック URL を設定します。JWT には使用されないため、https://localhost. を使用できます。
「デジタル署名の使用」のチェックボックスをオンにします。
前に作成した cert.pem ファイルをアップロードします。
必要なアクセス許可を追加します。
APIs (api) を使用してユーザーデータを管理します。
カスタムアクセス許可 (custom_permissions) にアクセスします。
ID URL サービス (ID、プロファイル、E メール、アドレス、電話) にアクセスします。
一意のユーザー識別子 (openid) にアクセスします。
リクエストはいつでも実行します (refresh_token、オフラインアクセス)。
名前付きユーザーの Issue JSON Web Token (JWT) ベースのアクセストークンのチェックボックスをオンにします。
[保存] を選択します。
[Continue] を選択します。
[コンシューマーの詳細を管理] を選択します。
コンシューマーキー (クライアント ID) をコピーします。
コンシューマーシークレット (クライアントシークレット) をコピーします。
[キャンセル] をクリックします。
JSON ウェブトークン (JWT) の生成
キーペアを pkcs12 に変換します (プロンプトが表示されたらエクスポートパスワードを設定します)。
openssl pkcs12 -export -in cert.pem -inkey key.pem -name jwtcert > jwtcert.p12
pkcs12 から Java キーストアを作成します (プロンプトが表示されたら送信先キーストアパスワードを設定し、送信元キーストアパスワードの以前のエクスポートパスワードを指定します)。
keytool -importkeystore -srckeystore jwtcert.p12 -destkeystore keystore.jks -srcstoretype pkcs12 -alias jwtcert
keystore.jks に jwtcert エイリアスが含まれていることを確認します (プロンプトが表示されたら、以前の送信先キーストアのパスワードを入力します)。
keytool -keystore keystore.jks -list
Salesforce ドキュメントに記載されている Java クラス JWTExample を使用して、署名付きトークンを生成します。
必要に応じて claimArray の値を編集します。
claimArray [0] = クライアント ID
claimArray [1] = salesforce ユーザー ID
claimArray [2] = salesforce ログイン URL
claimArray [4] = エポックからのミリ秒単位の有効期限。3660624000000 は 2085-12-31 です。
path/to/keystore を keystore.jks への正しいパスに置き換えます。
keystorepassword を、入力した送信先キーストアパスワードに置き換えます。
privatekeypassword を、入力したソースキーストアのパスワードに置き換えます。
コードをコンパイルします。このコードは、base64 エンコーディングの Apache Commons Codec
によって異なります。 javac -classpath ".:./commons-codec-1.16.1.jar" JWTExample.java
コードを実行します。
java -classpath ".:commons-codec-1.16.1.jar" JWTExample
接続されたアプリと 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(); } } }