Amazon Cognito ユーザープールでの認証コード付与での PKCE の使用 - Amazon Cognito

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

Amazon Cognito ユーザープールでの認証コード付与での PKCE の使用

Amazon Cognito は、認証コード付与でコード交換 (PKCE) 認証の証明キーをサポートしています。PKCE は、パブリッククライアント向けの OAuth 2.0 認証コード付与を拡張したものです。PKCE は、傍受された認証コードが使用されるのを防ぎます。

Amazon Cognito が PKCE を使用する方法

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

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

PKCE で認可付与フローを実装するには
  1. Amazon Cognito コンソールを開きます。プロンプトが表示されたら、 AWS 認証情報を入力します。

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

  3. リストから既存のユーザープールを選択するか、ユーザープールを作成します。ユーザープールを作成すると、ウィザード中にアプリケーションクライアントを設定し、ホストされた UI を設定するように求められます。

    1. 新しいユーザープールを作成する場合は、ガイド付きセットアップ中にアプリクライアントを設定し、ホストされた UI を設定します。

    2. 既存のユーザープールを設定する場合は、ドメインパブリックアプリケーションクライアント を追加します。

  4. PKCE のコードチャレンジを作成するために、ランダムな英数字文字列を生成します。通常はユニバーサル一意識別子 (UUID) です。この文字列は、リクエストで に送信する code_verifierパラメータの値ですトークンエンドポイント

  5. 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
  6. 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
  7. 認証を収集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
  8. レスポンスを確認します。これには、ID、アクセス、更新トークンが含まれます。Amazon Cognito ユーザープールトークンの使用の詳細については、「」を参照してくださいユーザープールでのトークンの使用