基于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挑战并发送验证码:
- 先完成PASSWORD_VERIFIER挑战(计算密码验证响应并调用
respondToAuthChallenge) - 收到
SMS_MFA挑战后,Cognito自动发送验证码到用户手机
补充说明
- 检查用户池配置:确认手机号已设为可验证属性,或MFA功能已开启(针对场景3)
- 当前你的
generateSRPA方法生成的参数是有效的(否则不会拿到PASSWORD_VERIFIER响应),但该逻辑仅适用于SRP登录流程,和验证码发送无关
内容的提问来源于stack exchange,提问作者Soer
相关产品推荐
相关产品推荐

