You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于AWS Cognito用户池的无密码MFA服务端验证问题

问题分析与解决方案

你当前的问题核心是用错了AWS Cognito的认证流程:USER_SRP_AUTH是针对已有密码用户的登录验证流程,目的是完成SRP密码验证,而非触发手机验证码发送。所以即便请求成功拿到PASSWORD_VERIFIER挑战,也不会收到短信验证码。

为什么移动端正常?

移动端应该是走了符合“获取验证码”场景的正确流程(比如忘记密码、手机号验证或MFA登录的后续步骤),而非直接调用USER_SRP_AUTH。

针对不同场景的解决方案

场景1:忘记密码,发送重置验证码

如果是用户忘记密码需要获取验证码重置,直接调用forgotPassword方法:

async sendForgotPasswordCode(phoneNumber: string) {
  const params = {
    ClientId: process.env.AWS_COGNITO_CLIENT_ID,
    Username: phoneNumber
  };

  try {
    const result = await this.cognitoIdentityServiceProvider.forgotPassword(params).promise();
    console.log('验证码发送结果:', result);
    return result;
  } catch (error) {
    console.error('发送验证码失败:', (error as Error).message);
    throw error;
  }
}

场景2:注册后验证手机号

如果是用户注册后需要验证手机号有效性,调用getUserAttributeVerificationCode方法:

async sendPhoneVerificationCode(phoneNumber: string) {
  const params = {
    ClientId: process.env.AWS_COGNITO_CLIENT_ID,
    Username: phoneNumber,
    AttributeName: 'phone_number'
  };

  try {
    const result = await this.cognitoIdentityServiceProvider.getUserAttributeVerificationCode(params).promise();
    console.log('手机号验证验证码发送结果:', result);
    return result;
  } catch (error) {
    console.error('发送手机号验证验证码失败:', (error as Error).message);
    throw error;
  }
}

场景3:登录时的MFA验证码

如果是用户开启了短信MFA,需要先完成USER_SRP_AUTH的PASSWORD_VERIFIER挑战,登录流程才会触发SMS_MFA挑战并发送验证码:

  1. 先完成PASSWORD_VERIFIER挑战(计算密码验证响应并调用respondToAuthChallenge)
  2. 收到SMS_MFA挑战后,Cognito自动发送验证码到用户手机

补充说明

  • 检查用户池配置:确认手机号已设为可验证属性,或MFA功能已开启(针对场景3)
  • 当前你的generateSRPA方法生成的参数是有效的(否则不会拿到PASSWORD_VERIFIER响应),但该逻辑仅适用于SRP登录流程,和验证码发送无关

内容的提问来源于stack exchange,提问作者Soer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 08:56:09