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

Amplify Cognito Auth:三步式忘记密码流程中如何单独验证验证码?

AWS Amplify 三步式忘记密码流程实现方案

问题背景

你想实现三步式忘记密码流程:输入邮箱 → 验证验证码 → 设置新密码,但Amplify的Auth.forgotPasswordSubmit必须同时传入验证码和新密码,没法单独校验验证码。试了传空密码,只得到“密码无效”的错误,没法判断验证码到底对不对。

可行方案

Amplify基于AWS Cognito实现,而Cognito处理forgotPasswordSubmit时会先验证验证码的有效性,再检查密码是否符合规则。利用这个逻辑,你可以通过错误码区分验证结果,完美适配三步流程:

1. 发送验证码(第一步)

保留原有逻辑,用户输入邮箱后调用发送接口:

import { Auth } from 'aws-amplify';

const sendVerificationCode = async (username) => {
  try {
    await Auth.forgotPassword(username);
    // 发送成功,跳转至验证码输入页
  } catch (err) {
    console.error('验证码发送失败:', err);
    // 提示用户邮箱不存在等错误
  }
};

2. 验证验证码(第二步)

用户输入验证码后,调用forgotPasswordSubmit时传入不符合规则的占位密码(比如空字符串),通过错误码判断验证码是否有效:

const checkVerificationCode = async (username, code) => {
  try {
    // 故意传无效密码,触发密码校验(仅在验证码正确时才会走到这一步)
    await Auth.forgotPasswordSubmit(username, code, '');
  } catch (err) {
    switch (err.code) {
      case 'CodeMismatchException':
      case 'ExpiredCodeException':
        return { isValid: false, msg: '验证码错误或已过期,请重新输入' };
      case 'InvalidPasswordException':
        // 验证码正确,只是密码不符合要求,跳转至设置新密码页
        return { isValid: true, msg: '验证码验证通过' };
      default:
        return { isValid: false, msg: err.message };
    }
  }
};

3. 设置新密码(第三步)

验证码验证通过后,用户输入合规的新密码,再次调用forgotPasswordSubmit完成重置:

const resetUserPassword = async (username, code, newPassword) => {
  try {
    await Auth.forgotPasswordSubmit(username, code, newPassword);
    return { success: true, msg: '密码重置成功' };
  } catch (err) {
    return { success: false, msg: err.message };
  }
};

核心逻辑说明

  • Cognito的校验顺序是验证码优先:只要验证码错误/过期,会直接返回对应错误,不会走到密码校验环节;
  • 只有验证码完全有效,才会校验密码是否符合规则,此时返回密码错误就意味着验证码没问题;
  • 无需额外调用底层API,通过Amplify抛出的错误码就能精准判断验证结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:35:24