迁移用户 Lambda 触发器 - Amazon Cognito
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

迁移用户 Lambda 触发器

如果用户在使用密码登录时或在使用忘记密码流程时不在用户池中,Amazon Cognito 会调用此触发器。Lambda 函数成功返回后,Amazon Cognito 将在用户池中创建用户。有关利用用户迁移 Lambda 触发器进行身份验证流程的详细信息,请参阅利用用户迁移 Lambda 触发器将用户导入用户池

要在用户登录时或在忘记密码流程中,将用户从您的现有用户目录迁移到 Amazon Cognito 用户池,请使用此 Lambda 触发器。

迁移用户 Lambda 触发器源

triggerSource 值 触发事件
UserMigration_Authentication 登录时的用户迁移。
UserMigration_ForgotPassword 在忘记密码流程中迁移用户。

迁移用户 Lambda 触发器参数

这些是 Amazon Cognito 随同常见参数中的事件信息一起传递给此 Lambda 函数的参数。

JSON
{ "userName": "string", "request": { "password": "string", "validationData": { "string": "string", . . . }, "clientMetadata": { "string": "string", . . . } }, "response": { "userAttributes": { "string": "string", . . . }, "finalUserStatus": "string", "messageAction": "string", "desiredDeliveryMediums": [ "string", . . .], "forceAliasCreation": boolean, "enableSMSMFA": boolean } }

迁移用户请求参数

userName

用户在登录时输入的用户名。

password

用户在登录时输入的密码。Amazon Cognito 不会在由忘记密码流程发起的请求中发送此值。

validationData

一个或多个键/值对,其中包含用户登录请求中的验证数据。要将此数据传递给 Lambda 函数,您可以在 InitiateAuthAdminInitiateAuth API 操作中使用 ClientMetadata 参数。

clientMetadata

一个或多个键/值对,您可以将其作为自定义输入内容提供给迁移用户触发器的 Lambda 函数。要将此数据传递给 Lambda 函数,您可以在 AdminRespondToAuthChallengeForgotPassword API 操作中使用 ClientMetadata 参数。

迁移用户响应参数

userAttributes

此字段为必填。

该字段必须包含一个或多个名称/值对,Amazon Cognito 将其存储在用户池的用户配置文件中并用作用户属性。您可以同时包括标准的和自定义的用户属性。自定义属性需要使用 custom: 前缀,以便与标准属性区分开来。有关更多信息,请参阅自定义属性

注意

要在忘记密码流程中重置密码,用户必须拥有经过验证的电子邮件地址或经过验证的电话号码。Amazon Cognito 将包含重置密码代码的消息发送到用户属性中的电子邮件地址或电话号码。

属性 要求
创建用户池时标记为必需的所有属性 如果迁移过程中缺少任何必需的属性,Amazon Cognito 将使用默认值。
username

如果您在为用户池配置了用户名登录之外,还配置了别名登录,并且用户输入了有效的别名值作为用户名,则此属性是必需的。该别名值可以是电子邮件地址、首选用户名或电话号码。

如果请求和用户池满足别名要求,则函数的响应必须将收到的 username 参数分配给别名属性,此外,响应必须将您自己的值分配给 username 属性。如果您的用户池不符合所需的条件,无法将收到的 username 发送到别名,则响应中的 username 参数必须与请求完全匹配,否则就会被忽略。

注意

在用户池中,username 必须唯一。

finalUserStatus

您可以将此参数设置为 CONFIRMED 以自动确认用户,这样他们就可以使用之前的密码登录。当您将用户设置为 CONFIRMED 时,他们无需执行额外的操作即可登录。如果您未将此属性设置为 CONFIRMED,则它会设置为 RESET_REQUIRED

finalUserStatus 设置为 RESET_REQUIRED,则意味着用户在迁移之后,必须在登录时立即更改密码,并且您的客户端应用程序必须在身份验证中处理 PasswordResetRequiredException

注意

使用 Lambda 触发器迁移期间,Amazon Cognito 不强制执行您为用户池配置的密码强度策略。如果密码不符合您配置的密码策略,Amazon Cognito 仍会接受密码,以便它继续迁移用户。要强制实施密码强度策略并拒绝不符合策略的密码,请验证代码中的密码强度。然后,如果密码不符合策略,则将 finalUserStatus 设置为 RESET_REQUIRED

messageAction

您可以将此参数设置为 SUPPRESS,以拒绝发送 Amazon Cognito 通常会向新用户发送的欢迎消息。如果您的函数未返回此参数,Amazon Cognito 会发送欢迎消息。

desiredDeliveryMediums

您可以将此参数设置为 EMAIL 以通过电子邮件发送欢迎消息,或者设置为 SMS 以通过 SMS 发送欢迎消息。如果您的函数未返回此参数,Amazon Cognito 通过 SMS 发送欢迎消息。

forceAliasCreation

如果您将此参数设置为 TRUE,并且 UserAttributes 参数中的电话号码或电子邮件地址已作为其他用户的别名存在,则 API 调用会将该别名从以前的用户迁移到新创建的用户。以前的用户无法再使用该别名登录。

如果您将此参数设置为 FALSE 而且别名存在,Amazon Cognito 不会迁移用户,并向客户端应用程序返回错误。

如果您不返回此参数,Amazon Cognito 会假定其值为“false”。

enableSMSMFA

将此参数设置为 true,要求迁移的用户完成 SMS 短信多重身份验证 (MFA) 才能登录。您的用户池必须启用 MFA。请求参数中的用户属性必须包含电话号码,否则该用户的迁移将失败。

示例:使用现有密码迁移用户

此示例 Lambda 函数使用现有密码迁移用户,并隐藏 Amazon Cognito 发送的欢迎消息。

Node.js
exports.handler = (event, context, callback) => { var user; if ( event.triggerSource == "UserMigration_Authentication" ) { // authenticate the user with your existing user directory service user = authenticateUser(event.userName, event.request.password); if ( user ) { event.response.userAttributes = { "email": user.emailAddress, "email_verified": "true" }; event.response.finalUserStatus = "CONFIRMED"; event.response.messageAction = "SUPPRESS"; context.succeed(event); } else { // Return error to Amazon Cognito callback("Bad password"); } } else if ( event.triggerSource == "UserMigration_ForgotPassword" ) { // Lookup the user in your existing user directory service user = lookupUser(event.userName); if ( user ) { event.response.userAttributes = { "email": user.emailAddress, // required to enable password-reset code to be sent to user "email_verified": "true" }; event.response.messageAction = "SUPPRESS"; context.succeed(event); } else { // Return error to Amazon Cognito callback("Bad password"); } } else { // Return error to Amazon Cognito callback("Bad triggerSource " + event.triggerSource); } };