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

NextAuth会话未返回自定义添加的键值对,是否无法自定义会话字段?

NextAuth 会话添加自定义字段问题解决

不是无法添加自定义字段,而是你缺少了会话回调的配置。NextAuth 默认只会将标准用户字段(如name、email、image)纳入会话,自定义字段需要手动通过callbacks配置传递。

解决步骤:

  • 在你的 NextAuth 配置文件(通常是pages/api/auth/[...nextauth].js/.ts)中添加callbacks选项,分别在jwt和session回调中处理自定义字段:
    1. jwt回调:将自定义字段存入 JWT Token,因为会话数据最终来自 Token;
    2. session回调:从 Token 中取出自定义字段,添加到返回的会话对象中。

修改后的完整配置示例:

import NextAuth from "next-auth";
import CredentialsProvider from "next-auth/providers/credentials";
import bcryptjs from "bcryptjs";
import db from "../../../utils/db";
import User from "../../../models/User";

export default NextAuth({
  providers: [
    CredentialsProvider({
      async authorize(credentials) {
        await db.connect();
        const user = await User.findOne({
          email: credentials.email,
        });
        await db.disconnect();
        if (user && bcryptjs.compareSync(credentials.password, user.password)) {
          return {
            _id: user._id,
            name: user.name,
            email: user.email,
            image: 'f',
            sample: 'someValue',
            isAdmin: user.isAdmin,
          };
        }
        throw new Error('Invalid email or password');
      },
    }),
  ],
  callbacks: {
    async jwt({ token, user }) {
      // 当用户首次登录时,user对象包含authorize返回的所有数据
      if (user) {
        token._id = user._id;
        token.isAdmin = user.isAdmin;
        token.sample = user.sample;
      }
      return token;
    },
    async session({ session, token }) {
      // 将Token中的自定义字段映射到会话对象
      session.user._id = token._id;
      session.user.isAdmin = token.isAdmin;
      session.user.sample = token.sample;
      return session;
    },
  },
  // 会话策略默认是jwt,显式声明更清晰
  session: {
    strategy: "jwt",
  },
});

配置完成后,你再打印会话对象时,sample字段就会正常显示在session.user中了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 04:37:29