Proof Key for Code Exchange (PKCE) 拡張
OAuth および認証プロバイダー実装のセキュリティを強化するには、OAuth 2.0 Proof Key for Code Exchange (PKCE) 拡張を使用します。PKCE は、組織全体で要求することも、特定の接続アプリケーションで要求することも、サポートされる認証プロバイダーで自動的に有効化することもできます。
必要なエディション
| 使用可能なエディション: すべてのエディション |
OAuth 認証コードフローおよびその派生フロー中に PKCE 拡張機能を使用することで、フローを開始するクライアントとフローを完了するクライアントが一致するようになります。これらのフロー中にアプリケーションが Salesforce に認証コードを要求し、アクセストークンと交換します。従来どおり、アプリケーションは接続アプリケーションのコンシューマーの秘密を含めてトークン要求を保護できます。コンシューマーの秘密は、アプリケーションと Salesforce のみが知っている情報であるため、Salesforce トークンエンドポイントにアクセスするためのパスワードとして機能します。攻撃者が認証コードへのアクセス権を何らかの形で取得できたとしても、コンシューマーの秘密がない限り、その認証コードを使用してアクセストークンを取得することはできません。
ただし、モバイルアプリケーションや単一ページアプリケーションなどの公開クライアントでは、コンシューマーの秘密の機密を保持できません。従来のクライアント-サーバーアーキテクチャを備えた非公開クライアントアプリケーションとは異なり、公開クライアントにはコンシューマーの秘密を保存できる非公開バックエンドはありません。公開クライアントがトークン要求でコンシューマーの秘密を送信すると、その秘密が漏洩するリスクがあります。そのため、公開クライアントのトークン要求にコンシューマーの秘密を含めることはお勧めしません。
コンシューマーの秘密がないと、アプリケーションは、認証コードを傍受してアクセストークンと交換しようとする攻撃者に対して脆弱性になります。PKCE では、アプリケーションと Salesforce のみが理解できる一連のハッシュされたパラメーターを使用して、コンシューマーの秘密のギャップを埋めることができます。PKCE を実装するフロー中に、code_verifier パラメーターと呼ばれるランダムな文字列がアプリケーションによって作成されます。次に、この値が SHA-256 アルゴリズムでハッシュされます。このハッシュ値は code_challenge パラメータです。SHA-256 ハッシュの主要な概念は、一方向にのみ機能することです。SHA-256 アルゴリズムを実行すると、code_verifierからcode_challengeを取得できます。ただし、逆方向に実行してcode_challengeからcode_verifierを取得することはできません。
一方向性関数という概念は、PKCE が機能する理由の重要な役割を果たします。アプリケーションは、認証コードの最初の要求を送信するときに、ハッシュされた code_challenge パラメーターを含めます。次に、アクセストークンを要求するときに、code_verifier パラメーターを含めます。これで Salesforce に両方のパラメーターが渡り、code_verifier 値で SHA-256 アルゴリズムを実行して code_challenge と比較できるようになります。値が一致する場合、同じアプリケーションで認証要求とトークン要求が送信されたことを Salesforce で確認できます。攻撃者が認証コードを持っていても、アプリケーションと Salesforce のみが知っている PKCE パラメーターがないため、アクセストークンと交換できません。
公開クライアントでは常に PKCE を実装することをお勧めします。非公開クライアントの場合、PKCE を実装して、トークン要求にコンシューマーの秘密を含めることをお勧めします。
Salesforce で認証コードフローのバリエーションを作成するときに code_challenge および code_verifier パラメーターを含めると、必要に応じて PKCE を実装できます。次のフローで PKCE がサポートされています。
- Web サーバーフロー
- ハイブリッド Web サーバーフロー
- ヘッドレス登録フロー、パスワードなしのヘッドレスログインフロー、ヘッドレスゲストフローを含む、認証コードとログイン情報フローのすべてのバリエーション。「ヘッドレス ID フロー」を参照してください。
PKCE が適用されるように、次のセキュリティ対策を講じることをお勧めします。
- [OAuth および OpenID Connect 設定] ページで組織全体で PKCE を要求する。この設定を有効にすると、PKCE を使用しないすべての認証コードフローのバリエーションが自動的にブロックされます。
- 特定の接続アプリケーションで PKCE を要求する。この設定を有効にすると、接続アプリケーション開発者は、このアプリケーションを使用して認証フローを作成するときに PKCE を実装する必要があります。
- 特定の認証プロバイダーの PKCE を使用します。サポートされる認証プロバイダーの場合、1 つの設定を選択すれば PKCE を自動的に使用できます。次の認証プロバイダーで PKCE がサポートされています。
PKCE パラメーターの生成
PKCE ジェネレーターエンドポイントを使用して、認証コードフローのバリエーションに実装できる code_challenge および code_verifier パラメーターをすばやく生成します。
- OAuth エンドポイントのクロスオリジンリソース共有 (CORS) を有効化します。これにより、
/services/oauth2/pkce/generatorエンドポイントの CORS が自動的に有効になります。 code_challengeおよびcode_verifierパラメータを生成するには、[私のドメイン] のログイン URL または Experience Cloud サイトの URL で HTTP GET 要求を/services/oauth2/pkce/generatorエンドポイントに送信します。この要求には、ヘッダーまたは本文パラメーターを含めないでください。[私のドメイン] のログイン URL を使用する要求の例を次に示します。GET /services/oauth2/pkce/generator? HTTP 1.1 Host: MyDomainName.my.site.salesforce.comExperience Cloud サイトの URL を使用する要求の例を次に示します。GET /services/oauth2/pkce/generator? HTTP 1.1 Host: MyDomainName.my.site.com次の PKCE パラメーターが返されます。
応答の例を次に示します。パラメーター 説明 code_challenge_methodcode_verifierからcode_challengeを計算するために使用される方法。Salesforce は、SHA256 アルゴリズムを使用してcode_verifierからcode_challengeを計算するS256メソッドを使用します。詳細は、「RFC 7636: Proof Key for Code Exchange by OAuth Public Clients (RFC 7636: OAuth 公開クライアントによるコード交換の証明鍵)」のセクション 4.2 を参照してください。code_challengeトークン要求で
code_verifier値の SHA256 ハッシュ値を指定します。値は、「RFC 4648: The Base16, Base32, and Base64 Data Encodings (RFC 4648: Base16、Base32、および Base64 データエンコード)」のセクション 5 で定義されているように Base-64 URL エンコードされます。認証フローを設定するときに、この値を認証要求に含めます。
code_verifiercode 値の推測を困難にするために、高エントロピーの 128 バイトのランダムなデータを指定します。このパラメーターを設定すると、認証コードの傍受攻撃を防ぐのに役立ちます。値は、「RFC 4648: The Base16, Base32, and Base64 Data Encodings (RFC 4648: Base16、Base32、および Base64 データエンコード)」のセクション 5 で定義されているように Base-64 URL エンコードされます。
認証フローを設定するときに、この値をトークン要求に含めます。
{ “code_challenge_method”:“S256” “code_challenge”:“JB7nT*************” “code_verifier”:“GkLvw**************” }
Web サーバーフロー、ハイブリッド Web サーバーフロー、および認証コードとログイン情報フローのバリエーションを設定するときに、指示に従って code_challenge と code_verifier パラメーターを要求に含めます。

