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

Next.js/next-auth:添加到会话的自定义变量在getServerSession()中无法获取

问题原因及解决方案

核心问题

调用getServerSession时未传入NextAuth的配置对象(authOptions),导致自定义的session回调未被执行,因此无法获取到添加的additionalVariable。

具体修复步骤

1. 抽离可复用的Auth配置

将NextAuth的配置抽成独立的authOptions对象,方便在需要的地方复用:

import NextAuth from 'next-auth';
import CredentialsProvider from 'next-auth/providers/credentials';

export const authOptions = {
  providers: [
    CredentialsProvider({
      credentials: {
        email: { label: "E-Mail Adresse" },
        password: { label: "Passwort", type: "password" },
      },
      authorize: async(credentials) => {
        const email = credentials?.email;
        const password = credentials?.password;

        const response = await fetch(`${process.env.url}/api/users/login`, {
          method: "POST",
          headers: { "Content-Type": "application/json" }, // 新增headers确保后端能解析JSON
          body: JSON.stringify({ email, password })
        });

        const data = await response.json();

        // 验证通过返回用户数据,失败返回null
        if (response.ok && data) {
          return data;
        }
        return null;
      }
    })
  ],
  callbacks: {
    // 先将自定义数据存入token(Credentials登录场景下,user仅在首次登录时存在)
    async jwt({ token, user }) {
      if (user) {
        // 可从登录返回的user中取字段,或直接设置固定值
        token.additionalVariable = user.customField || 'value';
      }
      return token;
    },
    // 从token同步数据到session
    async session({ session, token }) {
      session.additionalVariable = token.additionalVariable;
      return session;
    },
  },
};

export default NextAuth(authOptions);

2. 正确调用getServerSession

在服务器端代码中,导入authOptions并传入getServerSession:

// 注意:服务器端使用next-auth/next导入getServerSession,而非next-auth/react
import { getServerSession } from 'next-auth/next';
import { authOptions } from '../path-to-your-auth-config'; // 替换为你的配置文件路径

export async function myFunction() {
  const session = await getServerSession(authOptions);
  console.log(session); // 现在能看到additionalVariable字段
}

补充说明

  • Credentials提供者特性:authorize返回的user仅在用户首次登录时传递给jwt回调,后续请求依赖token生成session,因此需要通过jwt回调将自定义数据持久化到token中,再同步到session。
  • 版本兼容:如果使用NextAuth v3,提供者导入方式为import Providers from 'next-auth/providers',getServerSession的调用逻辑一致,仍需传入配置对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 09:51:16