認証チャレンジの定義の Lambda トリガー - Amazon Cognito

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

認証チャレンジの定義の Lambda トリガー

チャレンジの Lambda トリガー
認証チャレンジの定義

Amazon Cognito は、このトリガーを呼び出してカスタム認証フローを開始します。

この Lambda トリガーのリクエストには、session が含まれます。session パラメータは、現在の認証プロセスでユーザーに提示されたすべてのチャレンジが含まれる配列です。リクエストには、対応する結果も含まれます。session 配列は、チャレンジの詳細 (ChallengeResult) を時系列に保存します。チャレンジ session[0] は、ユーザーが最初に受け取るチャレンジを表します。

Amazon Cognito では、カスタムチャレンジを発行する前にユーザーパスワードを検証させることができます。リクエストレートクォータの認証カテゴリに関連付けられているすべての Lambda トリガーは、カスタムチャレンジフローで SRP 認証を行うと、実行されます。以下は、そのプロセスの概要です。

  1. アプリは、AuthParameters マップを使用して InitiateAuth または AdminInitiateAuth を呼び出してサインインを開始します。パラメータには CHALLENGE_NAME: SRP_A,SRP_A および USERNAME の値を含める必要があります。

  2. Amazon Cognito は、challengeName: SRP_AchallengeResult: true を含む初期セッションで、認証チャレンジの定義 Lambda トリガーを呼び出します。

  3. Lambda 関数は、これらの入力を受け取った後、challengeName: PASSWORD_VERIFIERissueTokens: falsefailAuthentication: false で応答します。

  4. パスワードの検証が成功すると、Amazon Cognito challengeName: PASSWORD_VERIFIERchallengeResult: true が含まれる新しいセッションで Lambda 関数を再度呼び出します。

  5. カスタムチャレンジを開始するために、Lambda 関数は challengeName: CUSTOM_CHALLENGEissueTokens: false、および failAuthentication: false で応答します。パスワード検証でカスタム認証フローを開始したくない場合は、CHALLENGE_NAME: CUSTOM_CHALLENGE を含む AuthParameters マップでサインインを開始できます。

  6. チャレンジループは、すべてのチャレンジが回答されるまで繰り返します。

認証チャレンジの定義の Lambda トリガーのパラメータ

Amazon Cognito がこの Lambda 関数に渡すリクエストは、以下のパラメータと Amazon Cognito がすべてのリクエストに追加する共通パラメータを組み合わせたものです。

JSON
{ "request": { "userAttributes": { "string": "string", . . . }, "session": [ ChallengeResult, . . . ], "clientMetadata": { "string": "string", . . . }, "userNotFound": boolean }, "response": { "challengeName": "string", "issueTokens": boolean, "failAuthentication": boolean } }

認証チャレンジの定義のリクエストパラメータ

Amazon Cognito が Lambda 関数を呼び出すときに、次のパラメータを提供します。

userAttributes

ユーザー属性を表す 1 つ以上の名前 - 値ペア。

userNotFound

ユーザープールクライアントの PreventUserExistenceErrorsENABLED に設定されている場合に、Amazon Cognito が入力するブール値です。true の値は、ユーザー ID (ユーザー名、メールアドレス、その他の詳細など) が既存のいずれのユーザーとも一致しなかったことを意味します。PreventUserExistenceErrorsENABLED に設定されている場合、サービスは存在しないユーザーをアプリに通知しません。Lambda 関数が同じユーザーエクスペリエンスを維持し、レイテンシーを考慮することをお勧めします。この方法では、発信者はユーザーが存在する場合と存在しない場合で異なる動作を検出することができません。

セッション

ChallengeResult 要素の配列。それぞれに以下の要素が含まれます。

challengeName

次のチャレンジタイプのいずれかです: CUSTOM_CHALLENGESRP_APASSWORD_VERIFIERSMS_MFA, DEVICE_SRP_AUTHDEVICE_PASSWORD_VERIFIER、または ADMIN_NO_SRP_AUTH

認証チャレンジの定義機能が、多要素認証を設定したユーザーに PASSWORD_VERIFIER チャレンジを発行すると、Amazon Cognito はそれに続いて SMS_MFA チャレンジを行います。関数には、SMS_MFA チャレンジからの入力イベントの処理を含めます。定義した認証チャレンジ関数から SMS_MFA チャレンジを呼び出す必要はありません。

重要

ユーザーが正常に認証され、トークンが発行されるべきかを判断するときは、常に define auth challenge 関数で challengeName をチェックし、予想された値と一致することを確認します。

challengeResult

ユーザーが正常にチャレンジを完了した場合は true に、それ以外の場合は false に設定します。

challengeMetadata

カスタムチャレンジの名前を入力します。challengeNameCUSTOM_CHALLENGE である場合にのみ使用されます。

clientMetadata

認証チャレンジの定義のトリガーに指定する Lambda 関数へのカスタム入力として提供できる 1 つ、または複数のキー/値ペア。このデータを Lambda 関数に渡すには、AdminRespondToAuthChallenge および RespondToAuthChallenge API オペレーションで ClientMetadata パラメータを使用できます。define auth challenge 関数を呼び出すリクエストに、AdminInitiateAuth および InitiateAuth API オペレーションの ClientMetadata パラメータに渡されたデータは含まれません。

認証チャレンジの定義のレスポンスパラメータ

レスポンスで、認証プロセスの次のステージを返すことができます。

challengeName

次のチャレンジの名前を含む文字列。ユーザーに新しいチャレンジを提示する場合は、ここでチャレンジ名を指定します。

issueTokens

ユーザーが認証チャレンジを十分に完了したと判断した場合、true に設定します。ユーザーがチャレンジを十分に満たしていない場合は、false に設定します。

failAuthentication

現在の認証プロセスを終了する場合は、true に設定します。現在の認証プロセスを続行するには、false に設定します。

認証チャレンジの定義の例

この例では、認証用に一連のチャレンジを定義し、それらのチャレンジがすべて正常に完了した場合にのみトークンを発行します。

Node.js
const handler = async (event) => { if ( event.request.session.length == 1 && event.request.session[0].challengeName == "SRP_A" ) { event.response.issueTokens = false; event.response.failAuthentication = false; event.response.challengeName = "PASSWORD_VERIFIER"; } else if ( event.request.session.length == 2 && event.request.session[1].challengeName == "PASSWORD_VERIFIER" && event.request.session[1].challengeResult == true ) { event.response.issueTokens = false; event.response.failAuthentication = false; event.response.challengeName = "CUSTOM_CHALLENGE"; } else if ( event.request.session.length == 3 && event.request.session[2].challengeName == "CUSTOM_CHALLENGE" && event.request.session[2].challengeResult == true ) { event.response.issueTokens = false; event.response.failAuthentication = false; event.response.challengeName = "CUSTOM_CHALLENGE"; } else if ( event.request.session.length == 4 && event.request.session[3].challengeName == "CUSTOM_CHALLENGE" && event.request.session[3].challengeResult == true ) { event.response.issueTokens = true; event.response.failAuthentication = false; } else { event.response.issueTokens = false; event.response.failAuthentication = true; } return event; }; export { handler }