JWTベアラーフローでSalesforceにアクセスする

Stay hungry. Stay foolish. Your time is limited, so don't waste it living someone else's life.

JWTベアラーフローでSalesforceにアクセスする

はじめに

JWTベアラーフローでSalesforceのOpenIDプロバイダーの動作を確認する機会があり、設定手順を説明する。

目次

  1. JWT署名用証明書を作成する
  2. 接続アプリケーションを設定する
  3. JWTを作成する
  4. トークンを取得する
  5. トークンを検証する

手順詳細

1. JWT署名用証明書を作成する

SFDC公式ヘルプ:OAuth 2.0 JWTベアラートークンフロー

JWT署名用の証明書を作成するコマンドは以下の通り。
下記のコマンドを実行すると3つのファイルが作成される。

#秘密鍵(private.pem)の作成
$openssl genrsa -out private.pem 2048
#証明書署名要求(client.csr)の作成
$openssl req -new -key private.pem -out client_crt.pem -subj "/C=JP/ST=Tokyo/L=Kitaku-Ku/O=Salesforce.com/OU=MuleSoft JWT/CN=*.salesforce.com"
#サーバ証明書(client.crt)の作成
$openssl x509 -req -signkey private.pem -in client_crt.pem -out client_jwt.pem -days 36524

2.接続アプリケーションを設定する

JWTベアラーフローでアクセストークンを取得するための接続アプリケーションを作成する。
[アプリケーションマネージャ] 一覧画面 > [新規接続アプリケーション]ボタンを押下する。

項目名サンプル値
接続アプリケーション名JWT Client
取引先責任者 メールaccount@salesforce.com
OAuth 設定の有効化チェックする
コールバック URLhttps://salesforce.com/callback
※ 実際に存在しなくても良い
デジタル署名を使用{client_jwt.pemファイルを指定する}
選択した OAuth 範囲APIを使用してユーザデータを管理(api)
フルアクセス(full)

[保存]ボタンを押下すると、接続アプリケーションの詳細画面が表示される。
[API (OAuth 設定の有効化)] > [コンシューマ鍵]をコピーする。
接続アプリケーション詳細画面 > [Manage]ボタンを押下する。
[接続アプリケーションの詳細]画面 > [ポリシーの編集]ボタンを押下する。

[許可されているユーザ]項目 > [管理者が承認したユーザは事前承認済み]を選択する。


[プロファイル]セクションにJWTベアラーフローを利用するユーザのプロファイルを追加する。

3.JWTを作成する

jwt.ioのJWTデバッガーを使って、JWTを生成する。
アルゴリズムをRS256を選択する。

JWT生成サイト

UNIX時間取得サイト

{
  "iss": "{接続アプリケーションクライアントID}",
  "aud": "https://login.salesforce.com",
  "sub": "{SFDCユーザID}",
  "exp": "{現在時刻から3分以内のUNIX時間}"
}

4.トークンを取得する

生成したJWTを使ってアクセストークンを取得する。

URL: https://{My domain}.my.salesforce.com/services/oauth2/token
HTTP Method: POST
Header:
  Content-Type: application/x-www-form-urlencoded
Request Body:
  grant_type: urn:ietf:params:oauth:grant-type:jwt-bearer
  assertion: {JWT}
  format: json

5.トークンを検証する

JWTベアラーフローで取得したトークンを検証エンドポイントで検証する。

URL: https://{My domain}.my.salesforce.com/services/oauth2/introspect
HTTP Method: POST
Header:
  Content-Type: application/x-www-form-urlencoded
Request Body:
  token: {access token}
  client_id: {接続アプリケーションクライアントID}
  client_secret: {接続アプリケーションクライアントシークレット}

補足)件名のURLは組織ID/ユーザIDになっている

さいごに

いかがだったでしょうか。
MuleSoftに関わるとSalesforceのJWTベアラーフローを利用することが多く、備忘録的に書きました。
ぜひ、利用してみてください。では、