> ## Documentation Index
> Fetch the complete documentation index at: https://developers.authlete.com/llms.txt
> Use this file to discover all available pages before exploring further.

# PKCE

> RFC 7636 PKCE に関する技術情報（Authlete 2.x 向け）です。

<Note>
  このページは **Authlete 2.x** 向けのドキュメントです。3.0 の内容は[Proof Key for Code Exchange (PKCE)（3.0）](/ja/protocols-and-flows/protocol-extensions/proof-key-for-code-exchange-pkce)をご覧ください。
</Note>

# 1. イントロダクション

[RFC 7636](http://tools.ietf.org/html/rfc7636)： **Proof Key for Code Exchange** (PKCE, 「ピクシー」と発音します) は、 **認可コード横取り攻撃（authorization code interception attack）** への対策に関する仕様です。

<img alt="authorization code interception attack" class="mx-auto d-block" src="https://mintcdn.com/authlete/EJDZNZMvOu_9CJHJ/configuration-reference/endpoints/authorization_code_interception_attack.png?fit=max&auto=format&n=EJDZNZMvOu_9CJHJ&q=85&s=7d65ff051ff2e6a0b8a32681a778dd93" width="691" height="435" data-path="configuration-reference/endpoints/authorization_code_interception_attack.png" />

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文字の長さが必要となります。

<img alt="pkce authorization request" class="mx-auto d-block" src="https://mintcdn.com/authlete/EJDZNZMvOu_9CJHJ/configuration-reference/endpoints/pkce_authorization_request.png?fit=max&auto=format&n=EJDZNZMvOu_9CJHJ&q=85&s=36957427425019c9e84d435b0b476f6e" width="477" height="645" data-path="configuration-reference/endpoints/pkce_authorization_request.png" />

## 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` の値を、データベース上に保存します。認可サーバーはこれらの値を、その後クライアントアプリから送られてくるトークンリクエストの検証に用います。

<img alt="pkce authorization response" class="mx-auto d-block" src="https://mintcdn.com/authlete/EJDZNZMvOu_9CJHJ/configuration-reference/endpoints/pkce_authorization_response.png?fit=max&auto=format&n=EJDZNZMvOu_9CJHJ&q=85&s=5602266550adfb6fec44be2a271a153d" width="461" height="621" data-path="configuration-reference/endpoints/pkce_authorization_response.png" />

認可サーバーから認可コードを受け取った後、クライアントアプリはトークンリクエストに `code_verifier` パラメーターの値としてコードベリファイアを含めます。

<img alt="pkce token request" class="mx-auto d-block" src="https://mintcdn.com/authlete/EJDZNZMvOu_9CJHJ/configuration-reference/endpoints/pkce_token_request.png?fit=max&auto=format&n=EJDZNZMvOu_9CJHJ&q=85&s=fc3fb206ae556b8adf95ce48c3304958" width="430" height="499" data-path="configuration-reference/endpoints/pkce_token_request.png" />

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

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

<img alt="pkce token response" class="mx-auto d-block" src="https://mintcdn.com/authlete/EJDZNZMvOu_9CJHJ/configuration-reference/endpoints/pkce_token_response.png?fit=max&auto=format&n=EJDZNZMvOu_9CJHJ&q=85&s=cccc8d28ff808b4f33a393dfbdd02665" width="525" height="701" data-path="configuration-reference/endpoints/pkce_token_response.png" />

# 5. PKCE を試す（Authlete 2.x）

Authlete 2.x では、[ダイレクト認可エンドポイント](https://api.authlete.com/api/auth/authorization/direct/service-api-key) を用いて PKCE 付きの認可リクエストを試すことができます。サービス API キーとクライアント ID を用意し、`code_challenge` と `code_challenge_method=S256` を付けてアクセスしてください。

詳細な手順と設定は [Authlete ウェブサイトの PKCE ページ（2.x）](https://www.authlete.com/ja/developers/v2/pkce/) を参照してください。

Authlete では、クライアントに対し PKCE の利用および S256 の指定を強制する設定が可能です。
