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
相关产品推荐
相关产品推荐

