跳至内容

为什么 Amazon Cognito 不使用 ForgotPassword API 调用发送验证码电子邮件或短信?

2 分钟阅读
0

我想知道当我使用 ForgotPassword API 调用时,为什么 Amazon Cognito 没有发送验证码电子邮件或短信 (SMS)。

解决方案

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

检查垃圾邮件文件夹

确保验证电子邮件不会发送到用户的垃圾邮件文件夹。

确认该用户存在于用户池中

确认该用户存在于 Amazon Cognito 用户池中。要使用 Amazon Cognito 控制台在用户池中搜索用户,请参阅管理和搜索用户账户。您也可以使用 AdminGetUser API 调用。

检查用户状态

确认用户的状态不是 FORCE_CHANGE_PASSWORD

在管理员创建的用户使用提供的密码登录之前,默认情况下,用户状态为 FORCE_CHANGE_PASSWORD

如果用户状态为 FORCE_CHANGE_PASSWORD,则用户无法使用 ForgotPassword API 调用,也不会收到验证码。Amazon Cognito 会提示用户更改密码。

恢复用户的 AWS 账户

如果您在用户名和电话号码未通过验证的情况下调用 Forgot Password API,则会收到以下错误之一:

  • 在 AWS CLI 中:
    “An error occurred (InvalidParameterException) when calling the ForgotPassword operation: Cannot reset password for the user as there is no registered/verified email or phone_number”
  • 在 Amazon Cognito 控制台中:
    “Could not reset password for the account, please contact support or try again.”

要恢复用户账户,必须验证用户账户配置。检查恢复消息传送方式是电子邮件、电话、仅电子邮件、仅电话、电话(如可用)还是无。

完成以下步骤:

  1. 打开 Amazon Cognito 控制台
  2. 选择用户池。
  3. Authentication(身份验证)下,选择 Sign-in(登录)。
  4. User account recovery(用户账户恢复)部分中,选中 Recovery message delivery method(恢复消息传送方法)下的选项。然后,确认传送方式为用户的已验证属性。
  5. 确认传送方式为用户的已验证属性。

处于 CONFIRMED(已确认)状态的用户可能没有经过验证的电子邮件或电话号码来恢复密码。当您选中验证复选框以创建账户时,必须验证管理员创建的用户账户的电子邮件和电话号码。

要解决此问题,请使用以下方法之一将您的电子邮件和电话号码的 verified(已验证)状态设置为 true

更新您的用户属性

如果您是管理员,请运行以下 AdminUpdateUserAttributes API 调用:

aws cognito-idp admin-update-user-attributes --user-attributes Name=example-verification-method,Value=true --user-pool-id example-userpoolID --username example-user-name

**注意:**根据用户的恢复消息传送方法,将 example-verification-method 替换为 email_verifiedphone_number_verified。将 example-userpoolID 替换为您的用户池的 ID,将 example-user-name 替换为想要运行 Forgot Password API 调用的用户的姓名。

如果您是用户,请登录,然后运行以下 UpdateUserAttributes API 调用:

aws cognito-idp update-user-attributes --user-attributes Name=example-verification-method,Value=true --access-token example-access-token

**注意:**根据用户的恢复消息传送方法,将 example-verification-method 替换为 email_verifiedphone_number_verified。将 example-access-token 替换为您的访问令牌的值。

注册前 Lambda 触发器
使用注册前 Lambda 触发器将用户的电子邮件和电话号码属性设置为已验证

SignUp
如果您是用户,请完成以下步骤:

  1. 运行以下 SignUP API 调用:
    aws cognito-idp sign-up --client-id example-client-ID --username example-user-name
    **注意:**将 example-client-ID 替换为您想要注册的应用程序客户端 ID。将 example-user-name 替换为您的用户名。
  2. 记下前面命令输出中的 Session 值。
  3. 运行以下 ConfirmSignUp API 调用:
    aws cognito-idp confirm-sign-up --client-id example-client-ID --username example-user-name --confirmation-code example-confirmation-code
    **注意:**将 example-client-ID 替换为您要注册的应用程序客户端的 ID。将 example-user-name 替换为您的用户名。将 example-confirmation-code 替换为您在步骤 2 中记下的 Session 值。

如果您是管理员,请运行以下 AdminConfirmSignUp API 调用:

aws cognito-idp admin-confirm-sign-up --client-id example-client-ID --username example-user-name

**注意:**将 example-client-ID 替换为应用程序客户端的 ID。将 example-user-name 替换为用户名。

查看短信的账户支出限额

Amazon Cognito 使用 Amazon Simple Notification Service (Amazon SNS) 传送短信。如果您设置的账户支出配额超出账户支出限额,则 Amazon SNS 不会发布短信。

要查看或更改账户支出限额,请参阅使用 AWS 管理控制台设置短信首选项

查看 Amazon SES 配额

Amazon Cognito 使用 Amazon Simple Email Service (Amazon SES) 传送电子邮件。默认情况下,Amazon Cognito 允许您的用户池每天发送有限数量的电子邮件。有关详细信息,请参阅资源数量和大小配额

要设置更高的电子邮件传送率,您可以将您的用户池配置为使用您的 Amazon SES 电子邮件配置。有关说明,请参阅 Amazon Cognito 用户池的电子邮件设置

使用 AdminSetUserPassword API 调用重置用户密码

管理员可以使用 AdminSetUserPassword API 调用将 Amazon Cognito 用户池中的用户密码设置为临时或永久密码。拥有临时密码的用户必须在临时密码到期之前登录并更改该密码。用户重置临时密码,或密码为永久后,状态将更改为 CONFIRMED(已确认)。

相关信息

短信传送失败的原因

admin-get-user

AdminResetUserPassword

AWS 官方已更新 4 个月前