Salesforce OAuth 2.0 JWT Bearer フロー



 OAuth 2.0 JWT Bearer フローは、サーバー間の統合シナリオに使用されます。このフローでは、証明書を使用して JWT リクエストに署名し、明示的なユーザー操作を必要としません。ただし、このフローにはクライアント アプリの事前承認が必要です

 https://www.apexhours.com/salesforce-oauth-2-0-jwt-bearer-flow/

 https://help.salesforce.com/s/articleView?id=sf.nc_create_edit_oath_jwt_bearer_ext_cred.htm&type=5

 # user hasn't approved this consumer

 + [Authorizing Scratch Org using JWT commands is giving this error: We encountered a JSON web token error, which is likely not an issue with Salesforce CLI. Here’s the error: Error authenticating with JWT. Errors encountered: audience is invalid](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007XINp0)

**類似**

+ [{ "error" : "invalid_grant", "error_description" : "user hasn't approved this consumer"}](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T4WW6SAN)
+ [Authorize Scratch Org with the JWT Bearer Flow: Error & Fix](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S000009HRRFSA4)
+ [ERROR running force:user:create: Error authenticating with JWT config due to: user hasn't approved this consumer](https://github.com/forcedotcom/cli/issues/1028)


# Unable to complete the JWT token exchange scope parameter not supported

+ [【未解決】External Credential with the JWT Bearer Flow: scope parameter not supported](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007YvkiGSAR)

「リフレッシュ トークンまたはオフライン アクセスをリクエストすることをお勧めします。そうしないと、トークンの有効期限が切れると、外部システムにアクセスできなくなります。」

Salesforce JWT フローは更新トークンを提供していない

:::note
finally SF Support concluded their investigation with a Known Issue 

有効期限が切れた accessToken を使用してアクセスすると、ヘッドレス ID エンドポイント ("/services/auth/headless/...") がステータス コード 400 を返します。
https://issues.salesforce.com/issue/a028c00000yyslS/headless-identity-endpointservicesauthheadless-returns-status-code-400-when-accessed-using-expired-accesstoken
:::

+ [Using refresh token with web server flow and JWT](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ZANE6SAP)

:::note alert
An internal server error has occurre
:::

:::note
I found this bug that seems to be the issue here:

https://issues.salesforce.com/issue/a028c00000xB248AAC/refresh-token-flow-does-not-work-correctly-when-jwt-based-access-tokens-is-enabled-after-winter-24-release
:::

# 未解決

+ [In JWT Bearer flow I'm getting this error : "Line: 94, Column: 1 System.JSONException: Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null') at input location [1,2]". Code provided below :](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007aic4v)

応答がXMLでしか帰って来ないのに、何故かJsonにこだわっている。仕様の問題でどうしようもないと思う

+ [{ "error" : "invalid_grant", "error_description" : "user hasn't approved this consumer"}](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T4WW6SAN)


# 参考

+ [SalesforceのOAuth2.0サーバ設定（接続アプリケーション） - JWT Bearer Token Flow編](https://qiita.com/daisuke180/items/b1846f2325a95f9cd20e)
+ [Salesforceの指定ログイン機能を用いたOAuth2.0クライアント設定 - JWT Bearer Token Flow編](https://qiita.com/daisuke180/items/a145df3aa237e3bae397)


# 暗号化

+ [ES256 アルゴリズムで署名された JWT で Crypto.verify() を使用する](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ReQmL)

:::note
エンコードに関係していることが判明しました。基本的に、エラーは Java によってスローされます。ES256 を使用するには、Apex (より正確にはその下の Java) で処理できる DER 表現から署名を作成する必要がありますが、残念ながらjwt.io は異なるエンコーディングを使用しているようです。
:::

# JWTトークンの設定に問題がありますか？無効なアクセストークンをすぐに受信します

+ [JWTトークンの設定に問題がありますか？無効なアクセストークンをすぐに受信します](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007igHsE)

:::note
Please check this article.

https://www.reddit.com/r/SalesforceDeveloper/comments/1g1643e/jwt_issue_invalid_token/
:::

# バグ？

+ [JWT-Based Access Tokens to integration Industries Integration Procedures](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000nowd)

:::note alert
{
        "errorCode": "APEX_ERROR",
        "message": "System.UnexpectedException: Salesforce System Error: 416842606-44081 (1739937901) (1739937901)\n\n(System Code)"
    }
:::