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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

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


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

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

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

您可以让 Amazon Cognito 在提出自定义质询之前验证用户密码。以下是此过程的概述:

  1. 要开始,请让您的应用启动登录,方法是调用InitiateAuth或者AdminInitiateAuthAuthParametersMap,包括CHALLENGE_NAME: SRP_A,SRP_AUSERNAME

  2. 您的定义身份验证质询 Lambda 触发器将在初始会话中调用,该会话包含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。如果您不想通过密码验证启动自定义身份验证流程,则可以使用AuthParametersMap 包括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

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

userNotFound

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

session

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

challengeName

质询类型。以下值之一:CUSTOM_CHALLENGESRP_APASSWORD_VERIFIERSMS_MFA, DEVICE_SRP_AUTHDEVICE_PASSWORD_VERIFIERADMIN_NO_SRP_AUTH

重要

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

challengeResult

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

challengeMetadata

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

clientMetadata

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

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

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

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); }