認可コード許可での PKCE の使用
Amazon Cognito は、認可コード付与で Proof Key for Code Exchange (PKCE)をサポートしています。PKCE は、パブリッククライアント向けの OAuth 2.0 認可コード付与の拡張機能です。PKCE は、傍受された認可コードの引き換えから保護します。
Amazon Cognito での PKCE の使用方法
PKCE で認証を開始するには、アプリケーションが一意の文字列値を生成する必要があります。この文字列は、最初の認可付与をリクエストするクライアントと、トークンの認可コードを交換するクライアントとを比較するために Amazon Cognito が使用するシークレット値であるコード検証子です。
アプリケーションは、コード検証文字列に SHA256 ハッシュを適用し、結果を base64 にエンコードする必要があります。ハッシュされた文字列をリクエスト本文の code_challenge
パラメータとして 認可エンドポイント に渡します。アプリケーションが認可コードとトークンとを交換する場合、トークンエンドポイント へのリクエスト本文に code_verifier
パラメータとしてプレーンテキストのコード検証文字列を含める必要があります。Amazon Cognito は、コード検証子に対して同じハッシュアンドエンコードオペレーションを実行します。Amazon Cognito は、コード検証子が認可リクエストで受け取ったものと同じコードチャレンジをもたらすと判断した場合のみ、ID トークン、アクセストークン、および更新トークンを返します。
PKCE を使用して認可付与フローを実装するには
-
Amazon Cognito コンソール
を開きます。プロンプトが表示されたら、AWS 認証情報を入力します。 -
[User Pools] (ユーザープール) を選択します。
-
リストから既存のユーザープールを選択するか、ユーザープールを作成します。ユーザープールを作成すると、ウィザード中にアプリケーションクライアントを設定し、ホストされた UI を構成するように求められます。
-
新しいユーザープールを作成すると、ガイド付きセットアップ中にアプリケーションクライアントを設定し、ホストされた UI を構成します。
-
既存のユーザープールを設定する場合で、ドメインとパブリックアプリケーションクライアントがない場合は、これらを追加します。
-
-
PKCE のコードチャレンジを作成するには、ランダムな英数字文字列、通常は Universally Unique Identifier (UUID) を生成します。この文字列は、リクエストで トークンエンドポイント に送信する
code_verifier
パラメータの値です。 -
SHA256 アルゴリズムを使用して
code_verifier
文字列をハッシュします。ハッシュ操作の結果を base64 にエンコードします。この文字列は、リクエストで 認可エンドポイント に送信するcode_challenge
パラメータの値です。次の Python 例では、
code_verifier
を生成し、code_challenge
を計算します。#!/usr/bin/env python3 import random from base64 import urlsafe_b64encode from hashlib import sha256 from string import ascii_letters from string import digits # use a cryptographically strong random number generator source rand = random.SystemRandom() code_verifier = ''.join(rand.choices(ascii_letters + digits, k=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
-
PKCE を使用した認可コード付与リクエストで、ホストされた UI サインインを完了します。URL の例を次に示します。
https://
mydomain.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 -
認可
code
を収集し、トークンエンドポイントを持つトークンと引き換えます。リクエストの例を次に示します。POST /oauth2/token HTTP/1.1 Host:
mydomain.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
-
応答を確認します。ID トークン、アクセストークン、更新トークンが含まれます。Amazon Cognito ユーザープールトークン使用の詳細については、「ユーザープール JSON ウェブトークン (JWT) の理解」を参照してください。