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

服务端Amplify Auth登录返回signInUserSession为null致MFA报错

问题根因

signIn调用后返回signInUserSession: null但Session字段有值,是Cognito MFA流程的正常中间状态,不属于配置错误或Amplify框架bug:
当用户池开启MFA能力、且当前登录用户未完成MFA绑定/校验时,账号密码校验通过后Cognito不会直接下发完整的有效用户会话,只会返回用于完成后续认证挑战的临时会话(即你看到的有效值Session字段),此时用户身份还未完成全流程认证,直接调用Auth.setupTOTP必然抛出“User is not authenticated”错误。

修复方案

按以下顺序排查调整即可解决问题:

  • 补全signIn流程的状态判断逻辑,不要拿到signIn返回值就直接调用TOTP绑定方法
    账号密码校验通过后,必须先判断返回结果的challengeName字段,再走对应流程,参考代码如下:
    // 注意:signIn第三个参数是预留的认证校验参数位,不要传入_id、roles、organizations这类自定义业务字段,会干扰流程状态解析
    const signInResult = await Auth.signIn(name, password);
    // 首次绑定TOTP的场景,challengeName会返回MFA_SETUP
    if (signInResult.challengeName === 'MFA_SETUP') {
      // 必须传入带临时Session的signInResult对象,不要自己构造user对象传入
      const totpSecret = await Auth.setupTOTP(signInResult);
      // 后续生成二维码供用户绑定、拿到用户输入的6位验证码后,调用confirmSignIn完成MFA绑定
      await Auth.confirmSignIn(
        signInResult,
        userInputCode,
        'SOFTWARE_TOKEN_MFA'
      );
    }
    // 已绑定过TOTP的用户登录时,challengeName会返回SOFTWARE_TOKEN_MFA,直接走验证码校验流程即可
    
  • 核对Cognito用户池配置
    进入Cognito用户池管理页确认以下配置:
    • MFA状态设置为「可选」或「必填」,未处于关闭状态
    • 可用MFA方式列表中已勾选「软件令牌TOTP」
    • 你当前使用的App客户端,未禁用MFA相关的操作权限
  • 修正服务端存储逻辑
    你当前配置了NodeLocalStorage作为Amplify的存储介质,需要保证从signIn到setupTOTP的调用流程中,使用的是同一个存储实例,不要每次调用Auth方法前都重新初始化存储、重复执行Auth.configure,否则临时会话状态会丢失,触发未认证报错。
注意事项

服务端使用Amplify Auth时不要直接照搬浏览器端的调用逻辑:浏览器环境下Amplify会自动持久化会话状态,但Node环境如果存储实例不共享、或者跳过挑战状态判断直接调用后续认证方法,必然触发会话异常。

  • 多用户并发的服务端场景下,不要用全局单例的Auth实例处理所有请求,避免不同用户的会话状态互相覆盖。
  • 自定义业务属性(如你之前传入的_id、roles、organizations)需要在用户注册、或管理员创建用户阶段写入用户属性,不要在登录接口中传入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:09:27