使用amazon-cognito-identity-js的CognitoUser如何单独校验验证码
AWS Cognito 忘记密码分步校验验证码实现方案
AWS Cognito 官方没有提供单独校验忘记密码验证码的公开接口,你可以通过以下两种方案实现「先校验验证码、再提交新密码」的分步流程:
方案1:测试密码验证法(最常用,无需额外后端开发)
核心逻辑是利用confirmPassword的错误返回类型判断验证码有效性:
- 第一步用户输入邮箱和验证码后,传入一个符合Cognito密码基础规则的固定测试密码调用
confirmPassword - 根据返回错误判断结果:
- 若返回
CodeMismatchException/ExpiredCodeException:代表验证码错误/过期,直接提示用户 - 若返回
InvalidPasswordException:代表验证码已经校验通过,只是测试密码不符合业务规则,此时可以跳转到新密码输入页
- 若返回
- 第二步用户输入真实新密码后,再次调用
confirmPassword完成密码重置
代码示例
// 第一步:单独校验验证码 const verifyResetCode = (email, code) => { const user = getUser(email); // 此处的测试密码必须符合你Cognito用户池配置的基础密码规则(如长度8位、含数字字母特殊字符等) const TEST_PASSWORD = "Test1234!"; return new Promise((resolve, reject) => { user.confirmPassword(code, TEST_PASSWORD, { onSuccess: () => { // 极端场景:测试密码刚好符合你的业务规则,直接重置成功,可根据业务需求处理 resolve({valid: true, resetSuccess: true}); }, onFailure: (err) => { if (err.code === "InvalidPasswordException") { // 验证码校验通过,跳转到新密码输入页 resolve({valid: true, resetSuccess: false}); } else { // 验证码相关错误,返回给前端提示 reject(err); } } }) }) } // 第二步:提交新密码完成重置 const submitNewPassword = (email, code, newPassword) => { const user = getUser(email); return new Promise((resolve, reject) => { user.confirmPassword(code, newPassword, { onSuccess: (data) => { console.log("密码重置成功", data); setStage(2); resolve(data); }, onFailure: (err) => { console.log("密码重置失败", err); reject(err); } }) }) } const getUser = (Username) => { return new CognitoUser({ Username, Pool }); };
方案2:自定义后端校验(更可控,需额外开发)
如果不想使用测试密码的方案,可以自己实现验证码校验逻辑:
- 用户请求发送忘记密码验证码时,你自己的后端先存储验证码和对应邮箱的映射关系(存在Redis/数据库,设置和Cognito一致的过期时间)
- 用户提交验证码时,先和你存储的验证码做校验,校验通过再跳转到新密码输入页
- 用户提交新密码时,再调用官方
confirmPassword接口完成最终的密码重置
注意事项
- 方案1的测试密码必须严格匹配你Cognito用户池的基础密码规则,否则会出现错误判断
- 两次调用
confirmPassword需要在Cognito验证码有效期内完成(默认1小时,可在用户池配置中修改)
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

