AWS Cognito - 管理员无需发送电子邮件即可重置用户密码

Ori*_*all 6 amazon-web-services amazon-cognito

我需要重置一些用户的密码,但发送忘记密码的电子邮件。只需重置密码,以便他们下次登录时我可以显示一条消息,要求他们请求重置密码。深入研究我需要的最基本的东西:在不通知用户的情况下,我需要让他们进入某种RESET_REQUIRED状态,以便让用户在前端返回一个PasswordResetRequiredException.

我最初认为AdminSetUserPassword这可以解决这个问题,但它使用户处于一种需要通过我没有设置的用户界面更改密码的状态。我不确定是否可以采取额外的步骤——设置密码AdminSetUserPassword,然后采取其他一些步骤?

否则,我已经尝试了很多不同的事情AdminResetUserPassword

  • 尝试从我在触发器上运行的 Lambda 中删除任何自定义消息CustomMessage_ForgotPassword,但这只会导致发送带有代码的通用消息。
  • 尝试将email_verified用户的属性更改为false(因为AWS文档指出,如果他们有经过验证的电子邮件,它将发送密码重置电子邮件),但这会使密码重置本身引发错误。
  • 尝试将用户的电子邮件更改为临时(假)电子邮件,以便将电子邮件发送到那里,但用户在更改电子邮件时会收到一封电子邮件。

有没有人有这方面的经验,或者这是一个不可能的要求?

Jor*_*dan 5

我今天正在处理这个问题,我想让你知道我最终做了什么。

有两种方法,而且只有两种方法可以让用户进入RESET_REQUIRED状态:

  1. 使用AdminResetUserPassword
  2. 使用Cognito 导入作业导入用户(如流程图所示)

正如您所确定的,选项 1 将通过电子邮件或短信发送代码,不,您无法轻易阻止它这样做。我向 AWS Support 提出了一个支持案例来询问这个问题,但他们也没有提出任何建议。最终,我考虑使用自定义发件人触发器,以便我可以在该触发器中决定是否发送电子邮件/短信,但设置外部电子邮件/短信发件人非常麻烦,所以我决定不再费心它。

在我们的例子中,我们将用户从一个用户池迁移到另一个用户池,因此导入方法最终运行得相当好。如果您只想重置现有用户池中的用户密码,也可以使用导入方法:

  1. 使用以下命令读取用户属性、MFA 选项等AdminGetUser
  2. 将此数据存储在安全的地方
  3. 使用以下命令从 Cognito 池中删除用户AdminDeleteUser
  4. 通过创建并运行 Cognito 导入作业来导入用户

这将成功地让您的用户做出RESET_REQUIRED陈述,但缺点是:

  • 用户的sub将会改变
  • 用户记住的设备将消失
  • 用户的登录历史记录将消失
  • 用户的MFA软件设备将消失

所以这是一个相当糟糕的解决方案,但这就是 Cognito 为我们提供的解决方案。