AWS SDK で認証方法を管理する - Amazon Cognito

AWS SDK で認証方法を管理する

Amazon Cognito ユーザープールのユーザーは、さまざまな初期サインインオプション (要素) を使用してサインインできます。一部の要素の場合、ユーザーは多要素認証 (MFA) を追加できます。これらの最初の要素として、ユーザー名とパスワード、ワンタイムパスワード、パスキー、カスタム認証などがあります。詳細については、「認証フロー」を参照してください。アプリケーションに UI コンポーネントが組み込まれていて、AWS SDK モジュールをインポートする場合は、認証用のアプリケーションロジックを構築する必要があります。2 つの主要な方法のいずれかを選択し、その方法に基づいて、実装する認証メカニズムを選択する必要があります。

クライアントベースの認証を実装できます。この場合、アプリケーションまたはクライアントが認証タイプを事前に宣言します。別の選択肢は、選択ベースの認証です。この場合、アプリケーションがユーザー名を収集し、ユーザーが使用できる認証タイプをリクエストします。これらのモデルは、要件に応じて、同じアプリケーションにまとめて実装することも、複数のアプリケーションクライアントに分割して実装することもできます。方法ごとに機能が異なります。例えば、クライアントベースにはカスタム認証があり、選択ベースにはパスワードなしの認証があります。

ユーザープール API の AWS SDK 実装で認証を実行するカスタム構築アプリケーションでは、ユーザープール設定、アプリケーションクライアント設定、クライアント側の設定に合わせて API リクエストを構成する必要があります。USER_AUTHAuthFlow で始まる InitiateAuth セッションは、選択ベースの認証を開始します。Amazon Cognito は、優先する認証方法または選択肢のリストのいずれかをチャレンジとして使用し、API に応答します。CUSTOM_AUTHAuthFlow で始まるセッションは、Lambda トリガーによるカスタム認証に直接進みます。

一部の認証方法は 2 つのフロータイプのいずれかに固定されており、一部の方法は両方で使用できます。

選択ベースの認証

アプリケーションは、選択ベースの認証として、以下の認証方法をリクエストできます。これらのオプションは、InitiateAuth または AdminInitiateAuthPREFERRED_CHALLENGE パラメータで宣言するか、RespondToAuthChallenge または AdminRespondToAuthChallengeChallengeName パラメータで宣言します。

これらのオプションを API コンテキストで確認するには、「RespondToAuthChallenge」で「ChallengeName」を参照してください。

選択ベースのサインインは、最初のリクエストに応じてチャレンジを発行します。このチャレンジは、リクエストされたオプションが利用可能であることを確認するか、利用可能な選択肢のリストを提供します。アプリケーションは、これらの選択肢をユーザーに表示することで、ユーザーが希望するサインイン方法の認証情報を入力し、チャレンジレスポンスで認証を続行できるようにします。

認証フローには、以下の選択ベースのオプションがあります。このタイプのすべてのリクエストでは、まずアプリケーションがユーザー名を収集するか、キャッシュから取得する必要があります。

  1. USERNAMEAuthParameters のみを使用するオプションをリクエストします。Amazon Cognito は SELECT_CHALLENGE チャレンジを返します。そこから、アプリケーションは、ユーザーに対してチャレンジを選択し、このレスポンスをユーザープールに返すよう求めることができます。

  2. PREFERRED_CHALLENGEAuthParameters と優先チャレンジのパラメータ (ある場合) を使用して優先チャレンジをリクエストします。例えば、PASSWORD_SRPPREFERRED_CHALLENGE をリクエストする場合は、SRP_A も含める必要があります。ユーザー、ユーザープール、アプリケーションクライアントがすべて優先チャレンジ用に設定されている場合、Amazon Cognito は、そのチャレンジの次のステップ (PASSWORD_SRPフローの PASSWORD_VERIFIEREMAIL_OTP フリーや SMS_OTP フローの CodeDeliveryDetails など) を返します。優先チャレンジが利用できない場合、Amazon Cognito は SELECT_CHALLENGE と利用可能なチャレンジのリストを返します。

  3. 最初にユーザーをサインインさせ、次に選択ベースの認証オプションをリクエストします。サインインしたユーザーのアクセストークンを含む GetUserAuthFactors リクエストは、利用可能な選択ベースの認証要素と MFA 設定を返します。このオプションを使用すると、ユーザーは最初にユーザー名とパスワードでサインインし、次に別の認証形式をアクティブ化できます。このオペレーションを使用して、優先チャレンジでサインインしたユーザーの追加のオプションを確認することもできます。

選択ベースの認証用にアプリケーションクライアントを設定するには、許可された認証フローに ALLOW_USER_AUTH を追加します。また、ユーザープール設定で許可する選択ベースの要素を選択する必要があります。以下のプロセスは、選択ベースの認証要素を選択する方法を示しています。

Amazon Cognito console
ユーザープールで選択ベースの認証オプションを設定するには
  1. AWS にサインインし、Amazon Cognito ユーザープールコンソールに移動します。ユーザープールを選択するか、新しいユーザープールを作成します。

  2. ユーザープール設定で、[サインイン] メニューを選択します。[選択ベースのサインインのオプション] を見つけ、[編集] を選択します。

  3. [パスワード] オプションは常に利用可能です。これには、PASSWORD フローと PASSWORD_SRPフローが含まれます。ユーザーのオプションに追加する [その他のオプション] を選択します。追加できるのは、パスキー (WEB_AUTHN)、メールメッセージのワンタイムパスワード (EMAIL_OTP)、SMS メッセージワンタイムパスワード (SMS_OTP) です。

  4. [Save changes] (変更の保存) をクリックします。

API/SDK

次の CreateUserPool または UpdateUserPool リクエスト本文の一部は、選択ベースの認証に使用できるすべてのオプションを設定します。

"Policies": { "SignInPolicy": { "AllowedFirstAuthFactors": [ "PASSWORD", "WEB_AUTHN", "EMAIL_OTP", "SMS_OTP" ] } },

クライアントベースの認証

クライアントベースの認証は、以下の認証フローをサポートします。これらのオプションは、InitiateAuth または AdminInitiateAuthAuthFlow パラメータで宣言します。

  1. USER_PASSWORD_AUTH および ADMIN_USER_PASSWORD_AUTH

    永続的なパスワードによるサインイン

    サインイン後の MFA

    この認証フローは、選択ベースの認証の PASSWORD と同等です。

  2. USER_SRP_AUTH

    永続的なパスワードと安全なペイロードによるサインイン

    サインイン後の MFA

    この認証フローは、選択ベースの認証の PASSWORD_SRP と同等です。

  3. REFRESH_TOKEN_AUTH

    更新トークン

    この認証フローは、クライアントベースの認証でのみ使用できます。

  4. CUSTOM_AUTH

    カスタム認証

    この認証フローは、クライアントベースの認証でのみ使用できます。

クライアントベースの認証の場合、Amazon Cognito は、ユーザーが認証フローを開始する前に認証方法を決定済みであると想定します。ユーザーが提供するサインイン要素を決定するロジックは、デフォルト設定またはカスタムプロンプトで決定し、ユーザープールへの最初のリクエストで宣言する必要があります。InitiateAuth リクエストは、リストされているオプションの 1 つ (USER_SRP_AUTH など) に直接対応するサインイン AuthFlow を宣言します。この宣言により、リクエストには、認証を開始するためのパラメータ (USERNAMESECRET_HASHSRP_A など) も含まれます。Amazon Cognito は、このリクエストに続けて、SRP の PASSWORD_VERIFIER や TOTP MFA によるパスワードサインインの SOFTWARE_TOKEN_MFA など、追加のチャレンジを発行する場合があります。

クライアントベースの認証用にアプリケーションクライアントを設定するには、許可された認証フローに ALLOW_USER_AUTH 以外の認証フローを追加します。例えば、ALLOW_USER_PASSWORD_AUTHALLOW_CUSTOM_AUTHALLOW_REFRESH_TOKEN_AUTH を追加します。クライアントベースの認証フローを許可するために、追加のユーザープール設定を行う必要はありません。