NextAuth调用getServerSession返回user字段全为undefined问题求助
问题解决:Server Component中getServerSession返回的user字段为undefined
问题原因
你使用JWT作为session策略,在CredentialsProvider场景下,NextAuth不会自动将authorize方法返回的用户数据同步到session对象中,必须通过callbacks手动处理JWT和session的字段映射。
解决方案
修改你的[...nextauth].ts文件,添加callbacks配置,将后端返回的用户数据存入JWT Token,并在生成session时将Token中的数据映射到session.user:
import CredentialsProvider from "next-auth/providers/credentials"; import NextAuth, { NextAuthOptions } from 'next-auth'; import api from "../../../settings"; export const authOptions: NextAuthOptions = { session: { strategy: 'jwt' }, pages: { signIn: "/auth/login", }, secret: process.env.JWT_SECRET, providers: [ CredentialsProvider({ type: 'credentials', name: 'Ingresar', credentials: {}, async authorize(credentials, req) { const { email, password } = credentials as { email: string, password: string }; const res = await fetch(`${api}/login`, { method: 'POST', headers: { "Content-Type": "application/json" }, body: JSON.stringify({email, password}) }) const user = await res.json() if (res.ok && user) { // 确保后端返回的user包含你需要的字段(比如id、email、name等) return user } return null } }) ], // 添加以下callbacks配置 callbacks: { async jwt({ token, user }) { // 用户登录时,将authorize返回的user数据合并到token中 if (user) { token.id = user.id; // 替换为你后端返回的用户ID字段名 token.email = user.email; token.name = user.name; // 如果后端返回name字段的话 // 其他你需要的字段都可以在这里添加 } return token; }, async session({ session, token }) { // 将token中的数据映射到session.user if (session.user) { session.user.id = token.id as string; session.user.email = token.email as string; session.user.name = token.name as string; // 对应添加其他字段 } return session; } } } export default NextAuth(authOptions);
关键说明
jwt回调:用户登录成功后,把authorize返回的用户数据附加到JWT Token中,让Token存储这些信息。session回调:从JWT Token中提取数据,赋值给session.user,这样getServerSession就能获取到完整的用户信息。- 注意替换代码中注释的字段名,确保和你的后端返回的
user对象字段一致。
内容的提问来源于stack exchange,提问作者José Cardozo
相关产品推荐
相关产品推荐

