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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 11:15:32