

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 認可コード許可での PKCE の使用
<a name="using-pkce-in-authorization-code"></a>

Amazon Cognito は、認可コード付与で Proof Key for Code Exchange (PKCE)をサポートしています。PKCE は、パブリッククライアント向けの OAuth 2.0 認可コード付与の拡張機能です。PKCE は、傍受された認可コードの引き換えから保護します。

## Amazon Cognito での PKCE の使用方法
<a name="how-pkce-works"></a>

PKCE で認証を開始するには、アプリケーションが一意の文字列値を生成する必要があります。この文字列は、最初の認可付与をリクエストするクライアントと、トークンの認可コードを交換するクライアントとを比較するために Amazon Cognito が使用するシークレット値であるコード検証子です。

アプリケーションは、コード検証文字列に SHA256 ハッシュを適用し、結果を base64 にエンコードする必要があります。ハッシュされた文字列をリクエスト本文の `code_challenge` パラメータとして [認可エンドポイント](authorization-endpoint.md) に渡します。アプリケーションが認可コードとトークンを交換する場合、[トークンエンドポイント](token-endpoint.md) へのリクエスト本文に `code_verifier` パラメータとしてプレーンテキストのコード検証文字列を含める必要があります。Amazon Cognito は、コード検証子に対して同じハッシュアンドエンコードオペレーションを実行します。Amazon Cognito は、コード検証子が認可リクエストで受け取ったものと同じコードチャレンジをもたらすと判断した場合のみ、ID トークン、アクセストークン、および更新トークンを返します。

**PKCE を使用して認可付与フローを実装するには**

1. [Amazon Cognito コンソール](https://console.aws.amazon.com/cognito/home)を開きます。プロンプトが表示されたら、 AWS 認証情報を入力します。

1. **[User Pools]** (ユーザープール) を選択します。

1. リストから既存のユーザープールを選択、または[ユーザープールを作成](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)します。ユーザープールを作成する場合は、ウィザード中にアプリケーションクライアントのセットアップとマネージドログインの設定を求められます。

   1. 新しいユーザープールを作成する場合は、ガイド付きセットアップ中にアプリケーションクライアントをセットアップし、マネージドログインを設定します。

   1. 既存のユーザープールを設定する場合で、[ドメイン](cognito-user-pools-assign-domain.md)と[パブリックアプリケーションクライアント](user-pool-settings-client-apps.md)がない場合は、これらを追加します。

1. PKCE のコードチャレンジを作成するには、ランダムな英数字文字列、通常は Universally Unique Identifier ([UUID](cognito-terms.md#terms-uuid)) を生成します。この文字列は、リクエストで [トークンエンドポイント](token-endpoint.md) に送信する `code_verifier` パラメータの値です。

1. SHA256 アルゴリズムを使用して `code_verifier` 文字列をハッシュします。ハッシュ操作の結果を base64 にエンコードします。この文字列は、リクエストで [認可エンドポイント](authorization-endpoint.md) に送信する `code_challenge` パラメータの値です。

   次の Python 例では、`code_verifier` を生成し、`code_challenge` を計算します。

   ```
   #!/usr/bin/env python3
   
   import secrets
   from base64 import urlsafe_b64encode
   from hashlib import sha256
   from string import ascii_letters
   from string import digits
   
   # use the secrets module for cryptographically strong random values
   alphabet = ascii_letters + digits
   code_verifier = ''.join(secrets.choice(alphabet) for _ in range(128))
   code_verifier_hash = sha256(code_verifier.encode()).digest()
   code_challenge = urlsafe_b64encode(code_verifier_hash).decode().rstrip('=')
   
   print(f"code challenge: {code_challenge}")
   print(f"code verifier: {code_verifier}")
   ```

   Python スクリプトからの出力例を次に示します。

   ```
   code challenge: Eh0mg-OZv7BAyo-tdv_vYamx1boOYDulDklyXoMDtLg
   code verifier: 9D-aW_iygXrgQcWJd0y0tNVMPSXSChIc2xceDhvYVdGLCBk-JWFTmBNjvKSdOrjTTYazOFbUmrFERrjWx6oKtK2b6z_x4_gHBDlr4K1mRFGyE8yA-05-_v7Dxf3EIYJH
   ```

1. PKCE を使用した認証コード付与リクエストで、マネージドログインのサインインを完了します。URL の例を次に示します。

   ```
   https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/authorize?response_type=code&client_id=1example23456789&redirect_uri=https://www.example.com&code_challenge=Eh0mg-OZv7BAyo-tdv_vYamx1boOYDulDklyXoMDtLg&code_challenge_method=S256
   ```

1. 認可 `code` を収集し、トークンエンドポイントを持つトークンと引き換えます。リクエストの例を次に示します。

   ```
   POST /oauth2/token HTTP/1.1
   Host: mydomain.auth.us-east-1.amazoncognito.com
   Content-Type: application/x-www-form-urlencoded
   Content-Length: 296
   
   redirect_uri=https%3A%2F%2Fwww.example.com&
   client_id=1example23456789&
   code=7378f445-c87f-400c-855e-0297d072ff03&
   grant_type=authorization_code&
   code_verifier=9D-aW_iygXrgQcWJd0y0tNVMPSXSChIc2xceDhvYVdGLCBk-JWFTmBNjvKSdOrjTTYazOFbUmrFERrjWx6oKtK2b6z_x4_gHBDlr4K1mRFGyE8yA-05-_v7Dxf3EIYJH
   ```

1. 応答を確認します。ID トークン、アクセストークン、更新トークンが含まれます。Amazon Cognito ユーザープールトークン使用の詳細については、「[ユーザープール JSON ウェブトークン (JWT) の理解](amazon-cognito-user-pools-using-tokens-with-identity-providers.md)」を参照してください。