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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 18:06:02