認証フローの切り替え
クライアント側の認証には4つの異なるフローがあります。
-
USER_SRP_AUTH:USER_SRP_AUTHフローはSRPプロトコル(セキュアリモートパスワード)を使用し、パスワードはクライアントから離れることなく、サーバーには不明です。これは推奨されるフローであり、デフォルトで使用されます。 -
USER_PASSWORD_AUTH:USER_PASSWORD_AUTHフローはユーザー認証情報をバックエンドに送信しますが、SRP暗号化を適用しません。「Migration」トリガーを使用してユーザーをCognitoに移行し、ユーザーにパスワードのリセットを強制しない場合は、このトリガーで呼び出されるLambda関数が指定された認証情報を検証する必要があるため、このタイプを使用する必要があります。 -
CUSTOM_WITH_SRP&CUSTOM_WITHOUT_SRP: 異なる要件を満たすようにカスタマイズできるチャレンジと応答のサイクルのシリーズができます。 -
USER_AUTH:USER_AUTHフローは、ユーザーが利用可能な認証方法のリストから選択できる、選択ベースの認証フローです。このフローは、ユーザーに認証方法を選択するオプションを提供したい場合に便利です。ユーザーに利用可能な選択肢は、EMAIL_OTP、SMS_OTP、WEB_AUTHN、PASSWORD、PASSWORD_SRPです。
認証フローはsignInを呼び出すときにカスタマイズできます。例えば、
await signIn({ username: "hello@mycompany.com", password: "hunter2", options: { authFlowType: 'USER_AUTH' }})認証フローの詳細については、AWSコグニト開発者ドキュメントを参照してください。
USER_AUTH フロー
USER_AUTHサインインフローは、認証の第1要因として以下のメソッドをサポートします: WEB_AUTHN、EMAIL_OTP、SMS_OTP、PASSWORD、およびPASSWORD_SRP。
認証を開始したときに必要な第1要因がわかっている場合は、signIn APIにpreferredChallengeとして渡して対応する認証フローを開始できます。
// PASSWORD_SRP / PASSWORD// 第1要因としてパスワードを使用してサインイン// パスワードは同じステップで提供する必要があることに注意してくださいconst { nextStep } = await signIn({ username: "hello@mycompany.com", password: "hunter2", options: { authFlowType: "USER_AUTH", preferredChallenge: "PASSWORD_SRP" // または "PASSWORD" },});
// WEB_AUTHN / EMAIL_OTP / SMS_OTP// 第1要因としてパスワードレスチャレンジを使用してサインイン// このステップではユーザーの追加入力は必要ありませんconst { nextStep } = await signIn({ username: "hello@example.com", options: { authFlowType: "USER_AUTH", preferredChallenge: "WEB_AUTHN" // または "EMAIL_OTP" または "SMS_OTP" },});必要な第1要因がわからない場合、またはユーザーに利用可能なオプションを提供したい場合は、初期のsignIn APIコールからpreferredChallengeを省略できます。
これにより、CONTINUE_SIGN_IN_WITH_FIRST_FACTOR_SELECTIONステップを介してユーザーが利用可能な認証第1要因を発見できます。その後、利用可能なオプションをユーザーに表示し、confirmSignIn APIを使用してユーザーの選択で応答できます。
const { nextStep: signInNextStep } = await signIn({ username: '+15551234567', options: { authFlowType: 'USER_AUTH', },});
if ( signInNextStep.signInStep === 'CONTINUE_SIGN_IN_WITH_FIRST_FACTOR_SELECTION') { // ユーザーに利用可能なチャレンジのリストを表示 console.log(`Available Challenges: ${signInNextStep.availableChallenges}`);
// `confirmSignIn` APIを使用してユーザーの選択で応答 const { nextStep: nextConfirmSignInStep } = await confirmSignIn({ challengeResponse: 'SMS_OTP', // または 'EMAIL_OTP'、'WEB_AUTHN'、'PASSWORD'、'PASSWORD_SRP' });}また、初期のsignIn APIコールに渡されたpreferredChallengeがユーザーで利用できない場合、AmplifyはCONTINUE_SIGN_IN_WITH_FIRST_FACTOR_SELECTIONネクストステップでも応答することに注意してください。
USER_PASSWORD_AUTH フロー
USER_PASSWORD_AUTH認証フローのユースケースはAmazon Cognitoへのユーザー移行です。
認証バックエンドのセットアップ
USER_PASSWORD_AUTH認証フローを使用するには、Cognitoアプリクライアントをこれを許可するように設定する必要があります。AWSコンソールでは、これはGeneral settings > App clients > Show Details(影響を受けるクライアント)> Enable username-password(non-SRP)flowでチェックボックスをチェックすることで行われます。AWS CLIまたはCloudFormationを使用している場合は、アプリクライアントを更新して、「Explicit Auth Flows」のリストにUSER_PASSWORD_AUTHを追加してください。
Amazon Cognitoでユーザーを移行する
Amazon Cognitoは、既存のユーザーディレクトリからユーザーをCognitoにシームレスに移行するためのトリガーを提供します。これは、ユーザープールの「Migration」トリガーを設定して、ユーザープール内にまだ存在しないユーザーが認証するか、パスワードをリセットするたびにLambda関数を呼び出すことで実現されます。
簡潔に言えば、Lambda関数は既存のユーザーディレクトリに対してユーザー認証情報を検証し、成功時にユーザー属性と状態を含むレスポンスオブジェクトを返します。エラーが発生した場合はエラーメッセージが返されます。Amazon Cognitoユーザープールインポートガイドで移行フローと詳細な手順を確認し、Amazon Cognito Lambdaトリガーガイドを使用して、lambdaがリクエストレスポンスオブジェクトをセットアップして処理する方法を確認してください。
CUSTOM_WITH_SRP & CUSTOM_WITHOUT_SRP フロー
Amazon Cognitoユーザープールは、ユーザーのアイデンティティを検証するためにパスワードに加えてカスタムチャレンジタイプを有効にするために認証フローをカスタマイズできます。これらのチャレンジタイプにはCAPTCHA、ダイナミックチャレンジ質問が含まれることがあります。CUSTOM_WITH_SRPフローはsignInを呼び出すときにパスワードが必要です。これらのフローは両方ともCognitoのCUSTOM_AUTHフローにマッピングされます。
カスタム認証フロー
アプリケーションでカスタム認証フローを開始するには、パスワードなしでsignInを呼び出します。カスタムチャレンジはconfirmSignIn APIを使用して応答する必要があります:
import { signIn, confirmSignIn } from 'aws-amplify/auth';
const challengeResponse = 'the answer for the challenge';
const { nextStep } = await signIn({ username, options: { authFlowType: 'CUSTOM_WITHOUT_SRP', },});
if (nextStep.signInStep === 'CONFIRM_SIGN_IN_WITH_CUSTOM_CHALLENGE') { // カスタムチャレンジの答えを送信 await confirmSignIn({ challengeResponse });}CAPTCHA認証
Lambda トリガーでCAPTCHAチャレンジを作成するには、AWS Amplify Google reCAPTCHAチャレンジ例をご覧ください。詳細な例があります。