如何在 Cognito 的注册过程中重新发送确认码

Meh*_*ran 3 amazon-web-services amazon-cognito

对于由于某种原因确认代码未发送给用户的情况,我在重新发送确认代码时遇到问题。这就是我所拥有的:

首先,我有一个注册步骤:

const cognito = new AWS.CognitoIdentityServiceProvider({region});
const params = {
    ClientId,
    Username,
    Password,
};
const result = await cognito.signUp(params).promise();
Run Code Online (Sandbox Code Playgroud)

此步骤(如果成功)应向用户的电子邮件地址(也是他们的用户名)发送一封包含确认码的电子邮件。现在我们假设由于某种原因电子邮件没有发送(原因本身并不重要)。我想为用户提供一个请求发送新电子邮件的机会。到目前为止,我为此目的一直在测试以下内容:

首先,我测试了该resendConfirmationCode方法:

const cognito = new AWS.CognitoIdentityServiceProvider({region});
const params = {
    ClientId,
    Username,
};
const result = await cognito.resendConfirmationCode(params).promise();
Run Code Online (Sandbox Code Playgroud)

执行此代码会抛出此错误消息:

UnhandledPromiseRejectionWarning: NotAuthorizedException: Cannot resend codes. Auto verification not turned on.
Run Code Online (Sandbox Code Playgroud)

然后,我测试了这种方法(因为这篇文章中给出的答案):

const cognito = new AWS.CognitoIdentityServiceProvider({region});
const params = {
  UserPoolId,
  Username,
  DesiredDeliveryMediums: ["EMAIL"],
  ForceAliasCreation: false,
  MessageAction: "RESEND",
}
const result = await cognito.adminCreateUser(params).promise();
Run Code Online (Sandbox Code Playgroud)

这次,我收到此错误:

UnhandledPromiseRejectionWarning: UnsupportedUserStateException: Resend not possible. ********-****-****-****-********** status is not FORCE_CHANGE_PASSWORD
Run Code Online (Sandbox Code Playgroud)

缩回的部分是用户的子部分。

那么,有谁知道如何为尚未确认的用户重新发送确认码?

Meh*_*ran 8

对于可能面临此问题的其他人来说,这是因为用户池的设置一开始就不发送验证码。以下是在用户池上启用发送验证码的方法:

  1. 转到 Coginto 和用户池
  2. 转到“MFA 和验证”页面
  3. 在“您要验证哪些属性?”部分中 选择其中一项(对我来说是“电子邮件”)

但对我来说,实际的问题是这个选项最初是在早些时候正确设置的。但当我执行此命令时,它被重置为“无验证”:

aws cognito-idp update-user-pool \
    --region us-east-1 \
    --user-pool-id us-east-1_********* \
    --lambda-config CustomMessage=arn:aws:lambda:us-east-1:************:function:composeEmail
Run Code Online (Sandbox Code Playgroud)

该命令应该引入一个 lambda 函数来编写验证码电子邮件。但由于某种原因,它也会重置其他设置,我不知道为什么。

无论如何,一旦正确设置了该设置,我的第一个解决方案就会起作用:

const cognito = new AWS.CognitoIdentityServiceProvider({region});
const params = {
    ClientId,
    Username,
};
const result = await cognito.resendConfirmationCode(params).promise();
Run Code Online (Sandbox Code Playgroud)

与 AWS 支持人员交谈后,您可以指定验证属性,如下所示:

aws cognito-idp 更新用户池 \
    --区域 us-east-1 \
    --user-pool-id us-east-1_********* \
    --lambda-config CustomMessage=arn:aws:lambda:us-east-1:************:function:composeEmail
    --自动验证属性电子邮件