如何验证 AWS Cognito 中的用户属性?

问题描述 投票:0回答:1

我正在尝试通过调用

verifyAttribute
方法来验证用户的电子邮件。

我能够进行身份验证并获得 JWT 响应 - 这样我就可以执行以下操作:

const { email, phone, accessToken } = verifyUserAttributesDto;
const getUser = await CognitoService.getUser(accessToken);
const attributes = getUser.UserAttributes.reduce(
  (acc, { Name, Value }) => ({ ...acc, [Name]: Value }),
  {},
);

console.log(attributes);

........

{
  sub: '5f04a73b-...',
  email_verified: 'false',
  phone_number_verified: 'false',
  phone_number: '+12222222222',
  given_name: 'First',
  family_name: 'Last',
  email: '[email protected]'
}

所以我知道我能够访问该用户。

后来我这样做:

const cognitoUser = new AmazonCognitoIdentity.CognitoUser({
      Username: attributes.email,
      Pool: this.userPool,
    });

...

CognitoUser {
  username: '[email protected]',
  pool: CognitoUserPool {
  ...

我相信我这里有一个

CognitoUser
的实例,但也许我没有;也许这就是问题所在。

如果我这样做:

return new Promise(function (resolve, reject) {
    return cognitoUser.verifyAttribute(attribute, accessToken, {
        onSuccess: (success) => {
            console.log(success);
            resolve(success);
        },
        onFailure: (err) => {
            console.log(err);
            reject(err);
          },
        });
    });

我得到的回复是:

错误 [ExceptionsHandler] 用户未经过身份验证

我已在 AWS 控制台中验证,用户的确认状态为

confirmed
,账户状态为
enabled

如果我有一个有效的 JWT,并且能够“获取”用户,为什么我会收到该错误?

nestjs amazon-cognito
1个回答
1
投票

很明显我不知道自己在做什么,这很痛苦。我之所以能做到这一点是因为:

  1. 我没有提供验证码
  2. 我使用了错误的身份提供商(cognito 与 cognito 用户)

需要验证的方法有两种:

  • getUserAttributeVerificationCode
  • verifyUserAttribute
async getUserAttributeVerificationCode(
    attribute: string,
    accessTokenDto: AccessTokenDto,
  ) {
    const { accessToken } = accessTokenDto;

    const cognito = new AWS.CognitoIdentityServiceProvider();

    try {
      return await cognito
        .getUserAttributeVerificationCode({
          AccessToken: accessToken,
          AttributeName: attribute,
        })
        .promise();
    } catch (err) {
      throw new BadRequestException(err.message);
    }
  }
async verifyUserAttribute(verifyUserAttributesDto: VerifyUserAttributesDto) {
    const { email, phone, accessToken, verificationCode } =
      verifyUserAttributesDto;

    const cognito = new AWS.CognitoIdentityServiceProvider();

    try {
      if (email || phone) {
        const attribute = email ? 'email' : 'phone';

        return await cognito
          .verifyUserAttribute({
            AccessToken: accessToken,
            AttributeName: attribute,
            Code: verificationCode,
          })
          .promise();
      }
    } catch (err) {
      throw new BadRequestException(err.message);
    }
  }

您首先需要使用有效的 JWT 调用

getUserAttributeVerificationCode
。然后您将收到验证码(电子邮件/短信)。

这样,您就可以使用所有正确的属性来调用

verifyUserAttribute

© www.soinside.com 2019 - 2024. All rights reserved.