このページは Authlete 2.x 向けのドキュメントです。3.0 の内容はProof Key for Code Exchange (PKCE)(3.0)をご覧ください。
1. イントロダクション
RFC 7636: Proof Key for Code Exchange (PKCE, 「ピクシー」と発音します) は、 認可コード横取り攻撃(authorization code interception attack) への対策に関する仕様です。
- 認可リクエスト:
code_challengeパラメーターとcode_challenge_methodパラメーターを追加 - トークンリクエスト:
code_verifierパラメーターを追加
2. PKCE 認可リクエスト
2.1 リクエストパラメーター
PKCE に対応したクライアントアプリは、認可リクエストにcode_challenge パラメーターを追加し、その値としてコードチャレンジを含めます。
code_challenge_method パラメーターはオプションです。ただし特別な理由がない限りは、コードチャレンジメソッドとして後述する S256 の利用が推奨されています。
2.2 コードチャレンジ・コードベリファイア
クライアントアプリは、コードベリファイアの値にコードチャレンジメソッドの計算ロジックを適用して、コードチャレンジの値を導出します。コードベリファイアの値は、[A-Z] / [a-z] / [0-9] / "-" / "." / "_" / "~" からなるランダムな文字列であり、最低43文字、最大128文字の長さが必要となります。

2.3 コードチャレンジメソッド
| Method | Logic |
|---|---|
plain | code_challenge = code_verifier |
S256 | code_challenge = BASE64URL-ENCODE(SHA256(ASCII(code_verifier))) |
S256 を用いる場合、クライアントアプリは認可リクエストの中に code_challenge_method=S256 を含める必要があります。
3. PKCE 認可レスポンス・トークンリクエスト
認可サーバーは認可コードを生成した後、その値と併せて、認可リクエストに含まれているcode_challenge の値と code_challenge_method の値を、データベース上に保存します。認可サーバーはこれらの値を、その後クライアントアプリから送られてくるトークンリクエストの検証に用います。

code_verifier パラメーターの値としてコードベリファイアを含めます。

4. PKCE トークンレスポンス
PKCE をサポートする認可サーバーは、トークンリクエストに正当なコードベリファイアが含まれているかを確認し、2 つのコードチャレンジを照合して検証します。トークンリクエストが正規の場合、認可サーバーは通常通りトークンを発行します。
5. PKCE を試す(Authlete 2.x)
Authlete 2.x では、ダイレクト認可エンドポイント を用いて PKCE 付きの認可リクエストを試すことができます。サービス API キーとクライアント ID を用意し、code_challenge と code_challenge_method=S256 を付けてアクセスしてください。
詳細な手順と設定は Authlete ウェブサイトの PKCE ページ(2.x) を参照してください。
Authlete では、クライアントに対し PKCE の利用および S256 の指定を強制する設定が可能です。