开启autoSignIn后AWS Cognito Auth.signUp无法获取JWT Token
我希望在启用autoSignIn:{enabled:true}的情况下,通过Auth.signUp获取JWT Token,请问这是否可行?
我当前的代码如下:
const signUp = async () => { await Auth.signUp({ username: email, password, attributes: { email, // optional name, }, autoSignIn:{ enabled: true } }) .then((data) => { console.log(data.user); //user.signInUserSession is null }) .catch((err) => { if (err.message) { setInvalidMessage(err.message); } console.log(err); }); await Auth.currentAuthenticatedUser() .then(user =>{ console.log(user) }) .catch(error => { console.log(error) //"User is not authenticated" }) };
我需要从userSession数据中获取JWT Token,用于条件渲染并存储到router.js中。Auth.signUp的响应对象包含一个CognitoUser,但其signInUserSession值为null。
补充说明:尝试在调用Auth.signUp后调用Auth.currentAuthenticatedUser(),但提示“用户未认证”错误。不过重启应用后,用户会处于已认证状态,但在同一应用实例内无法即时完成认证并获取Token。
核心原因:启用
autoSignIn后,Amplify的Auth.signUp只会等待注册流程完成,不会等待后续异步的自动登录流程结束。注册成功后,Amplify需要额外时间初始化并存储用户认证会话,因此此时直接调用currentAuthenticatedUser或读取signInUserSession会返回未认证状态。实时获取Token的正确方法:通过Amplify的
Hub监听认证状态变化,在用户状态变为signedIn时获取会话Token:import { Hub } from 'aws-amplify'; // 在组件挂载时添加监听 useEffect(() => { const authListener = Hub.listen('auth', (data) => { const { payload } = data; if (payload.event === 'signIn') { // 自动登录完成,此时可获取完整会话 Auth.currentSession() .then(session => { const idToken = session.getIdToken().getJwtToken(); const accessToken = session.getAccessToken().getJwtToken(); // 这里处理Token存储、条件渲染等逻辑 console.log('获取到JWT Token:', idToken); }) .catch(err => console.error('获取会话失败:', err)); } }); // 组件卸载时移除监听 return () => authListener(); }, []);代码风格优化:避免同时混用
async/await和.then/.catch,统一风格可减少时序问题:const signUp = async () => { try { const data = await Auth.signUp({ username: email, password, attributes: { email, name, }, autoSignIn: { enabled: true } }); console.log('注册成功:', data.user); } catch (err) { if (err.message) { setInvalidMessage(err.message); } console.error('注册失败:', err); } };重启后能获取认证状态的原因:应用重启时,Amplify会自动读取本地存储中保存的认证会话信息,完成自动登录,因此此时能直接拿到已认证状态,但注册后的即时流程中,会话还未完成初始化和存储。
内容的提问来源于stack exchange,提问作者benwl

