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
相关产品推荐
相关产品推荐

