定义身份验证质询 Lambda 触发器 - Amazon Cognito
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

定义身份验证质询 Lambda 触发器


            质询 Lambda 触发器。
定义身份验证质询

Amazon Cognito 调用此触发器以启动自定义身份验证流程

请求 Lambda 触发器包含 session,包含当前身份验证过程中向用户呈现的所有挑战的阵列。请求还包含相应的结果。质询详细信息 (ChallengeResult) 按时间顺序存储在 session 数组中,其中 session[0] 表示向用户显示的第一个质询。

您可以拥有 Amazon Cognito 在问题自定义挑战之前验证用户密码。以下是流程概述:

  1. 要开始,请致电App启动登录 InitiateAuthAdminInitiateAuthAuthParameters 地图,包括 CHALLENGE_NAME: SRP_A, 以及 SRP_AUSERNAME.

  2. 您的DefineAuthChallengeLambda触发器将用包含 challengeName: SRP_AchallengeResult: true.

  3. 接收这些输入后,您的Lambda功能会响应 challengeName: PASSWORD_VERIFIERissueTokens: falsefailAuthentication: false.

  4. 如果密码验证成功,您的Lambda函数将重新调用包含 challengeName: PASSWORD_VERIFIERchallengeResult: true.

  5. 您的Lambda功能可以通过响应 challengeName: CUSTOM_CHALLENGEissueTokens: false,和 failAuthentication: false。如果您不想使用密码验证启动自定义授权流,可以使用 AuthParameters 地图,包括 CHALLENGE_NAME: CUSTOM_CHALLENGE.

  6. 质询循环将一直重复到所有质询得到回答。

定义身份验证质询 Lambda 触发器参数

这些是此 Lambda 函数除常用参数以外还必需的参数。

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

定义身份验证质询请求参数

这些是调用 Lambda 函数时提供给 Lambda 函数的参数。

userAttributes

表示用户属性的一个或多个名称/值对。

找到用户

当为您的用户池客户端将 PreventUserExistenceErrors 设置为 ENABLED 时,将填充的一个布尔值。值 true 表示用户 ID(用户名、电子邮件地址等)不匹配任何现有用户。如果 PreventUserExistenceErrors 设置为 ENABLED,则服务将不会向应用程序报告用户不存在。建议的最佳做法是让您的 Lambda 函数保持相同的用户体验,包括延迟,以便调用者无法检测到用户存在或不存在时的不同行为。

--session

一个 ChallengeResult 元素数组,每个元素都包含以下元素:

challengeName

质询类型。以下之一:CUSTOM_CHALLENGESRP_APASSWORD_VERIFIERSMS_MFA, DEVICE_SRP_AUTHDEVICE_PASSWORD_VERIFIER,或 ADMIN_NO_SRP_AUTH.

重要

在确定用户是否已成功通过身份验证以及是否应颁发令牌时,您应始终检查 DefineAuthChallenge Lambda 触发器中的 challengeName,以确保它与预期值匹配。

challengeResult

如果用户成功完成质询,则设置为 true,否则设置为 false

challengeMetadata

自定义质询的名称。仅当 challengeNameCUSTOM_CHALLENGE 时使用。

clientMetadata

一个或多个键值对,您可以将其作为自定义输入内容提供给 Lambda 函数,该函数是为定义身份验证质询触发器指定的。您可以使用 AdminRespondToAuthChallengeRespondToAuthChallenge API 操作中的 ClientMetadata 参数将此数据传递给 Lambda 函数。

定义身份验证质询响应参数

在响应中,您可以返回身份验证流程的下一阶段。

challengeName

一个包含下一质询的名称的字符串。如果您希望向您的用户显示新的质询,请在此处指定质询名称。

issueTokens

如果您确定用户已通过完成相关质询而进行了充分的身份验证,则设置为 true,否则设置为 false

failAuthentication

如果您想要终止当前的身份验证流程,则设置为 true,否则设置为 false

定义身份验证质询示例

此示例针对身份验证定义一系列质询并发布质询令牌 (仅在成功完成所有质询后)。

Node.js
exports.handler = (event, context, callback) => { 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 = true; event.response.failAuthentication = false; } else { event.response.issueTokens = false; event.response.failAuthentication = true; } // Return to Amazon Cognito callback(null, event); }