Skip to main content
このページは Authlete 2.x 向けのドキュメントです。3.0 の内容はProof Key for Code Exchange (PKCE)(3.0)をご覧ください。

1. イントロダクション

RFC 7636Proof Key for Code Exchange (PKCE, 「ピクシー」と発音します) は、 認可コード横取り攻撃(authorization code interception attack) への対策に関する仕様です。 authorization code interception attack 2015 年 9 月に出版された同仕様は、認可コードフローの各種リクエストに関し、いくつかの追加パラメーターを定義しています
  1. 認可リクエスト: code_challenge パラメーターと code_challenge_method パラメーターを追加
  2. トークンリクエスト: code_verifier パラメーターを追加
この仕様により認可サーバーは、悪意のある(正当なコードベリファイアを持たない)クライアントアプリからのトークンリクエストを拒否できるようになります。

2. PKCE 認可リクエスト

2.1 リクエストパラメーター

PKCE に対応したクライアントアプリは、認可リクエストに code_challenge パラメーターを追加し、その値としてコードチャレンジを含めます。 code_challenge_method パラメーターはオプションです。ただし特別な理由がない限りは、コードチャレンジメソッドとして後述する S256 の利用が推奨されています。

2.2 コードチャレンジ・コードベリファイア

クライアントアプリは、コードベリファイアの値にコードチャレンジメソッドの計算ロジックを適用して、コードチャレンジの値を導出します。コードベリファイアの値は、[A-Z] / [a-z] / [0-9] / "-" / "." / "_" / "~" からなるランダムな文字列であり、最低43文字、最大128文字の長さが必要となります。 pkce authorization request

2.3 コードチャレンジメソッド

MethodLogic
plaincode_challenge = code_verifier
S256code_challenge = BASE64URL-ENCODE(SHA256(ASCII(code_verifier)))
S256 を用いる場合、クライアントアプリは認可リクエストの中に code_challenge_method=S256 を含める必要があります。

3. PKCE 認可レスポンス・トークンリクエスト

認可サーバーは認可コードを生成した後、その値と併せて、認可リクエストに含まれている code_challenge の値と code_challenge_method の値を、データベース上に保存します。認可サーバーはこれらの値を、その後クライアントアプリから送られてくるトークンリクエストの検証に用います。 pkce authorization response 認可サーバーから認可コードを受け取った後、クライアントアプリはトークンリクエストに code_verifier パラメーターの値としてコードベリファイアを含めます。 pkce token request

4. PKCE トークンレスポンス

PKCE をサポートする認可サーバーは、トークンリクエストに正当なコードベリファイアが含まれているかを確認し、2 つのコードチャレンジを照合して検証します。トークンリクエストが正規の場合、認可サーバーは通常通りトークンを発行します。 pkce token response

5. PKCE を試す(Authlete 2.x)

Authlete 2.x では、ダイレクト認可エンドポイント を用いて PKCE 付きの認可リクエストを試すことができます。サービス API キーとクライアント ID を用意し、code_challengecode_challenge_method=S256 を付けてアクセスしてください。 詳細な手順と設定は Authlete ウェブサイトの PKCE ページ(2.x) を参照してください。 Authlete では、クライアントに対し PKCE の利用および S256 の指定を強制する設定が可能です。