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

Next-Auth(凭证模式):如何将服务器完整响应传递至客户端

问题原因及解决方法

你的问题出在jwt和session回调的配置上,Next-Auth默认只会同步name、email、image这类基础字段到session,服务器返回的额外字段需要手动在回调里处理:

1. 错误点分析

  • jwt回调仅返回原token,没有把authorize方法返回的完整用户数据(包括advertising_id、api_key)存入token
  • session回调里直接使用的user参数,在凭证模式下并非你从服务器拿到的完整数据,而是Next-Auth处理后的简化版本

2. 修改后的配置代码

const authOptions: NextAuthOptions = {
  providers: [
    CredentialsProvider({
      id: 'credentials',
      name: 'credentials',
      credentials: {},
      async authorize(credentials) {
        const { email, password } = credentials as { email: string; password: string }
        const uuid = uuidv4()
        const res = await fetch("https://myapi.blabla/api/v9/accounts/sign-in/", {
          headers: {
            Authorization: `uuid ${uuid}`,
            "Client-Id": "vrfyrvKmSIRs8s1BZuHcmHNaZuTR2nIF0ZgFt39",
            "Content-Type": "application/json"
          },
          method: "POST",
          body: JSON.stringify({
            email,
            password
          })
        })

        const user = await res.json()

        if (!res.ok) {
          throw new Error(user.message)
        }

        if (res.ok && user) {
          return user
        }

        return null
      }
    })
  ],
  pages: {
    signIn: '/login'
  },
  callbacks: {
    // 修改jwt回调:把服务器返回的完整用户数据合并到token
    jwt: async ({ token, user }) => {
      // 仅登录时会传入user参数,此时把所有字段存入token
      if (user) {
        return { ...token, ...user }
      }
      // 后续请求直接返回现有token
      return token
    },
    // 修改session回调:从token中取出完整数据赋值给session.user
    session({ session, token }) {
      session.user = token as any
      return session
    },
  }
}

3. 关键说明

  • 在jwt回调中,用户首次登录时user参数就是服务器返回的完整响应,将其与token合并后,所有字段都会被存储
  • 在session回调中,直接从token里取数据赋值给session.user,前端通过useSession()就能获取到包括advertising_id、api_key在内的全部字段

内容的提问来源于stack exchange,提问作者Andres Bedoya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:28:28