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

开启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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 14:45:25