如何在AWS Amplify Cognito中实现注册成功后自动登录?
基于手机号的无密码认证(注册后自动登录)方案
由于Amplify默认不会在注册完成后自动登录用户(尤其是启用MFA的场景),需要手动衔接注册、MFA验证与登录流程,以下是具体实现思路:
1. 注册后直接触发MFA验证并完成登录
注册流程完成后,用户处于未确认或需MFA验证状态,需主动触发验证码发送,待用户输入后完成验证并登录:
代码示例
import { Auth } from 'aws-amplify'; // 1. 手机号注册(无密码模式用临时占位密码) const registerWithPhone = async (phoneNumber) => { try { const { user } = await Auth.signUp({ username: phoneNumber, password: 'temp-nopass-123', // 无密码场景下仅作占位,后续无需使用 attributes: { phone_number: phoneNumber } }); // 注册成功后,自动触发MFA验证码发送(针对SMS MFA) await Auth.sendSMSCode(user); return user; } catch (err) { console.error('注册失败:', err); } }; // 2. 验证MFA并自动登录 const verifyMfaAndAutoLogin = async (user, mfaCode) => { try { // 先完成注册确认(若用户池要求) await Auth.confirmSignUp(user.username, mfaCode); // 确认后立即执行登录 const authUser = await Auth.signIn(user.username); // 处理MFA挑战(若登录时触发) if (authUser.challengeName === 'SMS_MFA') { const session = await Auth.sendSMSMFAAnswer(authUser, mfaCode); console.log('自动登录成功:', session); return session; } console.log('自动登录成功:', authUser); return authUser; } catch (err) { console.error('MFA验证/登录失败:', err); } };
2. 自定义认证挑战简化无密码流程
若无需区分注册/登录步骤,可通过自定义认证挑战实现「手机号+短信验证码」一步完成注册+登录:
核心逻辑
- 在AWS控制台配置自定义认证挑战Lambda触发器,当用户首次输入手机号时自动创建用户并发送验证码
- 用户输入验证码后,Lambda验证通过直接返回认证会话,无需单独执行注册步骤
代码示例(前端调用)
const passwordlessAuth = async (phoneNumber, code) => { try { // 首次调用触发注册+验证码发送 const initAuth = await Auth.signIn({ username: phoneNumber }); if (initAuth.challengeName === 'CUSTOM_CHALLENGE') { // 输入验证码完成认证(自动完成注册+登录) const session = await Auth.sendCustomChallengeAnswer(initAuth, code); console.log('注册并登录成功:', session); return session; } } catch (err) { console.error('无密码认证失败:', err); } };
关键注意事项
- 确保用户池配置中启用「手机号作为用户名」,并开启SMS MFA或自定义认证挑战
- 无密码场景下,注册时的
password字段仅为Amplify API必填项,可使用固定临时值,无需告知用户 - 自定义认证挑战需编写Lambda函数处理用户创建、验证码发送与验证逻辑
内容的提问来源于stack exchange,提问作者yossef
相关产品推荐
相关产品推荐

