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

使用NextAuth Credentials登录后Session未返回用户名求助

解决NextAuth CredentialsProvider登录后Session返回空对象的问题

你的问题出在NextAuth默认不会自动将authorize方法返回的用户信息同步到Session中,需要手动配置jwt和session回调来完成这个映射。

修改NextAuth处理器代码

在你的NextAuth配置中添加session和jwt回调配置,具体修改如下:

const handler = NextAuth({
  providers: [
    CredentialsProvider({
      credentials: {
        username: { label: "Username", type: "text" },
        password: { label: "Password", type: "password" }
      },
      async authorize(credentials) {
        const res = await fetch("http://localhost:3000/api/login", {
          method: "POST",
          headers: {
            "Content-Type": "application/json"
          },
          body: JSON.stringify({
            username: credentials?.username, 
            password: credentials?.password
          }),
        })

        const user = await res.json();

        if (user) {
          return user
        } else {
          return null
        }
      }
    }),
  ],
  // 添加以下配置
  session: {
    strategy: "jwt", // CredentialsProvider必须使用JWT策略存储会话
  },
  callbacks: {
    async jwt({ token, user }) {
      // 用户登录时,将authorize返回的用户信息合并到JWT中
      if (user) {
        token.user = user;
      }
      return token;
    },
    async session({ session, token }) {
      // 将JWT中的用户信息同步到Session对象
      session.user = token.user;
      return session;
    }
  }
})

export { handler as GET, handler as POST }

配置说明

  • session.strategy: "jwt":CredentialsProvider不支持数据库会话存储,必须依赖JWT来保存用户身份信息。
  • jwt回调:用户首次登录时,user参数会携带authorize方法返回的用户对象,我们将其存入JWT的token.user字段;后续请求中,该回调会维护JWT的内容。
  • session回调:每次前端调用useSession或获取会话信息时,该回调会把JWT中的用户信息映射到返回的Session对象里,确保你能拿到完整的用户数据。

额外检查点

如果修改后仍有问题,可以排查:

  • 登录API返回的用户对象是否包含你需要的字段(如id、username等)
  • 在authorize方法中添加console.log(user),确认用户数据是否正确返回

内容的提问来源于stack exchange,提问作者Quốc Huy Nguyễn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 08:43:35