Next.js 15 + NextAuth 5 JWT认证:Session未保存用户信息问题
NextAuth 5 + Next.js 15 JWT会话user为空、session回调未触发的排查要点
1. 强制设置JWT会话策略
NextAuth 5默认会话策略并非JWT,必须显式配置才能触发JWT和session回调:
在auth.config.ts中添加:
export default { // 其他配置... session: { strategy: "jwt", // 核心配置,启用JWT会话模式 maxAge: 24 * 60 * 60, // 按需调整会话过期时长 }, // ... } satisfies NextAuthConfig;
2. 同时配置JWT与Session回调
session回调依赖JWT回调传递用户数据,二者必须配套定义:
在auth.config.ts的callbacks字段中补充:
export default { // 其他配置... callbacks: { // JWT回调:登录成功/Token更新时触发,将用户信息存入Token async jwt({ token, user }) { // 登录阶段user存在,合并用户字段到Token if (user) { token.id = user.id; token.name = user.name; token.email = user.email; // 添加其他需要的用户属性 } return token; }, // Session回调:每次获取会话时触发,从Token提取数据到session.user async session({ session, token }) { if (token && session.user) { session.user.id = token.id as string; session.user.name = token.name as string; session.user.email = token.email as string; // 对应JWT中存储的字段 } return session; }, }, // ... } satisfies NextAuthConfig;
3. 检查登录Provider的用户数据返回
无论使用Credentials还是OAuth Provider,必须确保用户验证逻辑返回完整的用户对象:
以Credentials为例:
export default { providers: [ Credentials({ credentials: { email: { label: "Email", type: "email" }, password: { label: "Password", type: "password" }, }, async authorize(credentials) { // 数据库查询/密码验证逻辑 const user = await getUserByEmail(credentials?.email); if (!user) return null; // 验证通过后返回包含核心字段的用户对象 return { id: user.id, name: user.name, email: user.email }; }, }), ], // ... };
若此处返回null或缺失用户字段,JWT回调的user参数会为空,导致Token无法存入用户信息。
4. 确认NextAuth初始化完整导入配置
在auth.ts中必须完整传入authConfig,避免遗漏回调、会话策略等关键配置:
import NextAuth from "next-auth"; import authConfig from "./auth.config"; export const { auth, handlers, signIn, signOut } = NextAuth(authConfig);
5. 清除旧会话缓存
浏览器可能留存空会话缓存,需清除缓存后重新登录,确保新的JWT和会话生效。
内容的提问来源于stack exchange,提问作者Luka Bugarin
相关产品推荐
相关产品推荐

