如何在 AWS Cognito 中的 Migrate User Lambda 触发器中操作电子邮件地址

ntt*_*ntt 6 amazon-cognito aws-lambda aws-userpools

我想在通过Amazon Cognito 中的迁移用户 Lambda 触发器将用户从一个用户池迁移到另一个用户池时修改电子邮件地址。

在本文的帮助下,我无需操作电子邮件地址即可运行用户迁移。lambda 函数在 Node.js 12.x 环境中运行,源用户池和目标用户池都配置为使用电子邮件作为唯一的用户名属性: 用户池配置

我的迁移用户响应参数如下:

{
  userAttributes: {
    email: 'foo@bar.com', // --> the manipulated email address
    email_verified: 'true'
  },
  finalUserStatus: 'CONFIRMED',
  messageAction: 'SUPPRESS'
}
Run Code Online (Sandbox Code Playgroud)

这会导致“用户电子邮件应该为空或与用户名相同,因为用户名属性是电子邮件。” 尝试迁移(即登录)时出现错误消息。因此,我按照此消息添加了被操纵的电子邮件地址作为用户名:

{
  userAttributes: {
    email: 'foo@bar.com',
    email_verified: 'true',
    username: 'foo@bar.com'
  },
  ...
}
Run Code Online (Sandbox Code Playgroud)

现在会导致“用户名无效或缺少电子邮件/电话号码/首选用户名属性”错误消息。根据本文档,这是预期的行为:

如果选择电子邮件作为别名,则用户名无法与有效的电子邮件格式匹配。

由于我不知道如何解决这个问题,所以我尝试了一下并更改了用户池配置,以便使用用户名和电子邮件地址进行注册: 另一个用户池配置

由于上面提到的第一个响应参数现在会导致“用户名不能是电子邮件格式,因为用户池是为电子邮件别名配置的”。错误消息,我将用户名设置为源用户之一(通过AdminGetUser API 检索):

{
  userAttributes: {
    email: 'foo@bar.com',
    email_verified: 'true',
    username: user.username
  },
  ...
}
Run Code Online (Sandbox Code Playgroud)

这再次导致“用户名无效或缺少电子邮件/电话号码/首选用户名属性”错误消息。

我已经考虑过在另一个(后续)Lambda 触发器(例如身份验证后 Lambda 触发器)中操作电子邮件,但我非常感谢您帮助我在 Migrate User Lambda 触发器中完成电子邮件操作。