SalesforceのOAuth2.0サーバ設定（接続アプリケーション） - JWT Bearer Token Flow編

SalesforceはOAuth2.0に対応し、サーバ(認可サーバ、リソースサーバ)としてもクライアントとしてノーコードで認証フローを実現できます。JWT Bearer Token Flowをサーバ側、クライアント側両方ともSalesforceで行った場合の設定等のサンプルを紹介します。

Salesforce教育コンテンツの本家Trailheadでは、[Authorization Code Flow(Webサーバフロー)の設定方法](https://trailhead.salesforce.com/ja/content/learn/projects/build-a-connected-app-for-api-integration)が紹介されているのでそちらも参考にしてください。英語版のみですが。

# やっていること
クライアントをSalesforce A、認可サーバ、リソースサーバをSalesforce Bとします。Salesforce BでAOuth2.0認証を行う接続アプリケーションを作成し、Salesforce AからRest APIが実行できることを確認します。

[OAuth2.0 JWT Bearer Token FlowのクライアントになるSalesforce Aのサーバ設定方法はこちら](https://qiita.com/daisuke180/items/a145df3aa237e3bae397)を参照ください。
OAuth2.0 JWT Bearer Token Flowのクライアント実装はSalesforce以外でもできます。[TeraskyさんのBlog](https://base.terrasky.co.jp/articles/iRj2p)でJS実装が紹介されており、とても分かりやすいです。

- Authorization Code Flow(Webサーバフロー)の認証フローで、Salesforce同士で認証する方法

は別記事で解説予定です。

# 手順
## 1. 接続アプリケーションの作成
### 1.1. 新規作成

「設定」→「アプリケーション」→「アプリケーションマネージャ」から、「新規接続アプリケーション」ボタンで接続アプリケーションを作成します。

| 設定項目 | 設定値 | 説明 |
| :---- | :--- | :---- |
| 接続アプリケーション名 | JwtBearerConnectApp(任意値) | お好みの値を設定 |
| API参照名 | JwtBearerConnectApp(任意値) | お好みの値を設定 |  
| 取引先責任者メール | your_email_address@example.com (任意値) | 本接続アプリケーションの管理者のメールアドレスを指定してください。本記事の手続き中で利用されるシーンはありません。 |  
| OAuth設定の有効化 | チェックする | OAuth2.0で認証するための設定 |  
| コールバックURL | https://example.com (適当なURL) | Authorization Code Flow利用時の設定値。JWT Bearer Token Flowでは利用しないため、他者に迷惑をかけない適当なURLを設定 | 
| デジタル署名を使用 | チェックしない（手順1.3.でチェックします）| クライアント側(Salesforce A)が作成したクライアント証明書を設定 |  
| 選択したOAuth範囲 | "api", "refresh_token, offline_access"を設定 | Rest API実行のためにapiを選択。JWT Bearer Token Flowのためにrefresh_token, offline_accessを選択(なぜこれが必要なのかは謎、、、) |  
| Webサーバフローの秘密が必要 | どちらでも | 標準でチェックが入っている。Authorization Code Flowの設定なので、チェックなくても動作します。 |  
| 更新トークンフローの秘密が必要 | どちらでも | 標準でチェックが入っている。JWTベアラートークンフローでは更新トークンフローは使わないので、チェックなくても動作します。 |  

![スクリーンショット 2023-03-17 17.55.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282138/ab3f0b1e-0be4-9b0a-8599-11b179a742ab.png)

## 1.2. アクセス制御の設定

作成した接続アプリケーション参照画面上部にある[Manage]ボタンを押下、表示された画面上部にある[ポリシーを編集]ボタンを再度押下して、以下設定を変更して保存します。

| 設定項目 | 設定値 | 説明 |
| :---- | :--- | :---- |
| OAuthポリシー | 管理者が承認したユーザーは事前承認済み | - |

接続アプリケーションへの接続を許可するユーザーに付与する権限セットを作成します。ここでは、[API User]としています。

作成した接続アプリケーション参照画面上部にある[Manage]ボタンを押下した画面の下の方の「権限セット」の部分にある[権限セットの管理]ボタンを押下して直前に作成した[API User]を設定します。

![スクリーンショット 2023-03-27 20.03.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282138/77557bee-0d62-5517-fd4c-20808eb68941.png)

## 1.3. クライアント証明書の登録

JWT Bearer Token Flowで接続するクライアントアプリ(本設定例の場合はSalesforce A)から、クライアント証明書を入手します。クライアント証明書は一般的に[＊.crt]の拡張子を持ったファイルです。

手順1.1.で作成した接続アプリケーション参照画面上部にある[編集]ボタンを押下、先ほどチェックをしなかった、[デジタル署名を使用]をチェックし、[ファイルを選択]ボタンを押下して、入手したクライアント証明書をアップロードします。

![スクリーンショット 2023-03-19 16.26.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282138/909ac0bf-ea9c-d96d-6f1e-041164b254c7.png)


## 2. クライアント側提供情報の取得とクライアント側の設定

JWT Bearer Token Flowで認証、API接続するためには、認証サーバ、リソースサーバからクライアントへいくつかの情報提供が必要です。その情報のラインナップと取得方法は以下のとおりです。

### 2.1. トークンエンドポイント
認証サーバ（今設定しているSalesforceのOrg）が本番環境や、Trailheadのハンズオン組織の場合は、
https://login.salesforce.com/services/oauth2/token
認証サーバが、Sandbox環境や、Scrach組織の場合は、
https://test.salesforce.com/services/oauth2/token
です。

トークンエンドポイントは、クライアント側で認証サーバのトークンエンドポイント値として利用します。

### 2.2. コンシューマー鍵
手順1.で作成した接続アプリケーション参照画面にある[コンシューマーの詳細を管理]ボタンを押下して、コンシューマー鍵を取得します。コンシューマー鍵の画面表示のため、登録された管理者アドレスに送信される確認コードが必要なので、管理者アドレスのメール受信可能な状態にしておいてください。
![スクリーンショット 2023-03-19 16.26.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282138/909ac0bf-ea9c-d96d-6f1e-041164b254c7.png)

![スクリーンショット 2023-03-17 17.58.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282138/4512f519-1538-a690-3fe8-33ea9742a3b3.png)

コンシューマー鍵、コンシューマの秘密は、設定によって(Client Credential Flowを使う場合など)はこれだけでRest APIにアクセス可能となる情報なので、不特定多数に公開せず接続先クライアントのみに開示するようにしてください。

コンシューマー鍵は、クライアント側でJWTクレームのiss(issuer)値として利用します。

### 2.3. 実行ユーザID
手順1.2.で設定した権限セット[API User]を付与したユーザを用意します。本設定では、[testuser@cunning-impala-mqsqh.dev](ハンズオン組織の私のドメインを活用してユニークユーザを作成)としています。そのほか、オブジェクトへのアクセス権限等は適宜設定してください。(とりあえず動作検証したいだけで、セキュリティを気にしないのであれば、システム管理者のプロファイルを割り当てておきましょう。)

実行ユーザは、クライアント側でJWTクレームのsub(subject)値として利用します。

### 2.4. 認証サーバ
認証サーバのURLです。手順2.1.で指定したトークンエンドポイントのサーバURLになります。https://login.salesforce.comまたは、https://test.salesforce.comになります。

実行ユーザは、クライアント側でJWTクレームのaud(audience)値として利用します。

上記2.1.〜2.4.の情報をクライアントに提供し、クライアント側の設定に反映します。[Salesforceの指定ログイン機能を用いたOAuth2.0クライアント設定 - JWT Bearer Token Flow編](https://qiita.com/daisuke180/items/a145df3aa237e3bae397)に沿ってクライアントを実装する場合は、それぞれ、以下の設定個所で設定します。

| 設定項目 | Salesforceの設定個所 |
| :---- | :--- |
| 2.1. トークンエンドポイント| [手順3.1.外部ログイン情報の作成]のIDプロバイダURL |
| 2.2. コンシューマー鍵 | [手順3.2.JWTクレームの設定]のiss |
| 2.3. 実行ユーザID | [手順3.2.JWTクレームの設定]のsub |
| 2.4. 認証サーバ | [手順3.2.JWTクレームの設定]のaud |


## 2. 接続テスト
クライアント側でOAuth認証およびRestAPIの接続を行い、上手くいくことを確認します。正常に接続できると、サーバ側では[設定]の[接続アプリケーションの OAuth の利用状況
]で表示される画面にて、作成した接続アプリケーションが表示されるようになります。
![スクリーンショット 2023-03-27 20.18.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282138/cac714fa-cd60-70c8-f291-661b4ac0b2b0.png)


# 参考情報
- [Salesforceヘルプ:サーバ間インテグレーション用の OAuth 2.0 JWT ベアラーフロー
](https://help.salesforce.com/s/articleView?id=sf.remoteaccess_oauth_jwt_flow.htm&type=5)
- [Apex開発者ガイド:接続アプリケーションの作成:API インテグレーション用の OAuth 設定の有効化](https://help.salesforce.com/s/articleView?id=sf.connected_app_create_api_integration.htm&type=5)
- [Trailhead:Build a Connected App for API Integration(英語)](https://trailhead.salesforce.com/ja/content/learn/projects/build-a-connected-app-for-api-integration)
- [TeraSkyBase TechBlog:OAuthのJWTベアラーフローを用いてSalesforceに接続する](https://base.terrasky.co.jp/articles/iRj2p)

# 関連記事
- [Salesforceの指定ログイン機能を用いたOAuth2.0クライアント設定 - JWT Bearer Token Flow編](https://qiita.com/daisuke180/items/a145df3aa237e3bae397)

今後もう少し追加する予定