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

如何在Next-Auth的session.user中添加自定义字段?

解决Next-Auth自定义session.user字段不生效的问题

你的问题核心在于使用JWT会话策略时,NextAuth不会自动将authorize返回的所有自定义字段同步到session中,默认仅识别id、name、email这类预设字段。要让userId和companyId出现在session里,必须通过jwt和session两个回调函数手动处理字段同步。

修改后的完整代码

import NextAuth from "next-auth";
import CredentialsProvider from "next-auth/providers/credentials";
import axios from "axios";

const handler = NextAuth({
  providers: [
    CredentialsProvider({
      name: "Credentials",
      credentials: {
        email: {
          label: "Email",
          type: "email",
          placeholder: "Enter your email",
        },
        password: { label: "Password", type: "password" },
      },
      async authorize(credentials, req) {
        const res = await axios({
          method: "POST",
          url: `${process.env.NEXT_PUBLIC_AUTH_URL}/api`,
          data: {
            query: `
              query Login($email: String!, $password: String!) {
                login(email: $email, password: $password) {
                  userId
                  token
                  tokenExpiration
                  companyId
                }
              }
            `,
            variables: {
              email: credentials.email,
              password: credentials.password,
            },
          },
        });
        // Validation
        if (res.data.errors) {
          throw new Error(res.data.errors[0].message);
        }
        const user = {
          userId: res.data.data.login.userId,
          companyId: res.data.data.login.companyId,
        };
        if (user) {
          return user;
        }
        return null;
      },
    }),
  ],
  session: {
    strategy: "jwt",
  },
  // 添加这两个回调函数
  callbacks: {
    async jwt({ token, user }) {
      // 用户登录时,将自定义字段添加到token中
      if (user) {
        token.userId = user.userId;
        token.companyId = user.companyId;
      }
      return token;
    },
    async session({ session, token }) {
      // 将token中的自定义字段同步到session.user
      if (session.user) {
        session.user.userId = token.userId;
        session.user.companyId = token.companyId;
      }
      return session;
    },
  },
  pages: {
    signIn: "/login",
    signOut: "/logout",
  },
  secret: process.env.NEXTAUTH_SECRET,
});

export { handler as GET, handler as POST };

关键说明

  1. jwt回调:在用户首次登录时,user参数会携带authorize返回的对象,我们把userId和companyId附加到JWT token里。后续每次请求都会携带这个token,回调会持续保留这些字段。
  2. session回调:每次前端通过useSession获取会话时,这个回调会把JWT token里的自定义字段映射到session.user中,这样前端就能直接访问到session.user.userId和session.user.companyId了。

验证方法

修改后重新启动项目,登录成功后在page.jsx中打印useSession返回的session对象,就能看到自定义字段已经出现在user里了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:53:17