通过 MFA 验证码(无密码)使用 AWS Cognito 用户池进行服务器端用户验证

Server-side user verification with AWS Cognito user pool via MFA verification code (without password)

提问人:Soer 提问时间:2/10/2023 更新时间:5/24/2023 访问量:270

问:

在使用 NodeJS + NestJS 的服务器端,TS: 4.7.4, “aws-sdk”: “^2.1138.0”。 尝试向 AWS Cognito 发送请求,以获取手机上的验证码。 距离实现短信配额还很遥远。

我的方法示例来自服务:

    async sendVerificationCode(phoneNumber: string) {
    const params = {
      AuthFlow: 'USER_SRP_AUTH',
      ClientId: process.env.AWS_COGNITO_CLIENT_ID,
      // UserPoolId: process.env.AWS_COGNITO_USER_POOL,
      AuthParameters: {
        USERNAME: phoneNumber,
        SRP_A: generateSRPA(),
      },
    };
    console.debug('=========== params: ', params);
    try {
      const result = await this.cognitoIdentityServiceProvider
        .initiateAuth(params)
        .promise();
      console.log('=========== result: ', result);
      return result;
    } catch (error) {
      if (error instanceof Error) {
        console.debug('=========== Error: ', error.message);
        throw error;
      }
    }
  }

第 SRP_A 代示例:

const N_HEX ='EEAF0AB9ADB38DD69C33F80AFA...';
export function generateSRPA() {
  const random = randomBytes(32);
  const randomHex = random.toString('hex');
  const srpA = createHash('sha256').update(randomHex).digest('hex');
  return createHash('sha256').update(srpA).update(N_HEX).digest('hex');
}

现在,请求已成功发送到 AWS 并获得响应:

=========== result:  {
  ChallengeName: 'PASSWORD_VERIFIER',
  ChallengeParameters: {
    SALT: '4e9b...',
    SECRET_BLOCK: '4x1k...',
    SRP_B: '161d...',
    USERNAME: 'b1d9...',
    USER_ID_FOR_SRP: 'b1d9...'
  }
}

但我的手机没有收到验证码。 同时,使用相同的用户池和相同的手机,所有流程都可以在连接到 Cognito 的移动应用程序上运行良好。

node.js nestjs amazon-cognito 服务器端 aws-userpools

评论

0赞 mike.slomczynski 2/10/2023
您可以做的是添加 CloudWatch for SMS 传输,以查看 SMS 无法传输的原因。你将无法看到过去的失败事件,因此你必须再次运行你的应用。您还可以绕过 Amazon Cognito 进行测试,只需发送测试短信即可。如果您从中学到了什么新东西,请告诉我。

答: 暂无答案