OAuth 2.0 JWT Bearer フローは、サーバー間の統合シナリオに使用されます。このフローでは、証明書を使用して JWT リクエストに署名し、明示的なユーザー操作を必要としません。ただし、このフローにはクライアント アプリの事前承認が必要です
user hasn't approved this consumer
類似
- { "error" : "invalid_grant", "error_description" : "user hasn't approved this consumer"}
- Authorize Scratch Org with the JWT Bearer Flow: Error & Fix
- ERROR running force:user:create: Error authenticating with JWT config due to: user hasn't approved this consumer
Unable to complete the JWT token exchange scope parameter not supported
「リフレッシュ トークンまたはオフライン アクセスをリクエストすることをお勧めします。そうしないと、トークンの有効期限が切れると、外部システムにアクセスできなくなります。」
Salesforce JWT フローは更新トークンを提供していない
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
An internal server error has occurre
I found this bug that seems to be the issue here:
未解決
応答がXMLでしか帰って来ないのに、何故かJsonにこだわっている。仕様の問題でどうしようもないと思う
参考
- SalesforceのOAuth2.0サーバ設定(接続アプリケーション) - JWT Bearer Token Flow編
- Salesforceの指定ログイン機能を用いたOAuth2.0クライアント設定 - JWT Bearer Token Flow編
暗号化
エンコードに関係していることが判明しました。基本的に、エラーは Java によってスローされます。ES256 を使用するには、Apex (より正確にはその下の Java) で処理できる DER 表現から署名を作成する必要がありますが、残念ながらjwt.io は異なるエンコーディングを使用しているようです。