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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 02:37:12