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

开发环境下Next.js中NextAuth会话数据丢失问题求助

问题分析与解决方案

核心问题出在**全局变量userInfo**上:

  • 开发环境下,Next.js会在文件变更或服务器刷新时进行热重载,模块会重新执行,全局变量userInfo会被重新初始化为空对象,导致会话数据丢失。
  • 生产环境中代码是一次性构建完成的,模块不会频繁重新加载,所以全局变量的状态能暂时保留,但这其实也是不安全的实践(比如多实例部署时同样会丢失数据)。

修复步骤

  1. 删除全局的userInfo变量,所有用户数据都通过JWT Token传递。
  2. 修改session回调,直接从Token中读取用户信息,而非依赖全局变量。

修改后的完整代码

import NextAuth from "next-auth/next";
import CredentialsProvider from "next-auth/providers/credentials";
import axios from "axios";

export default NextAuth({
  site: process.env.SITE,
  providers: [
    CredentialsProvider({
      name: "Credentials",
      async authorize(credentials, req) {
        let user = {};
        await axios
          .post(
            `${process.env.NEXT_PUBLIC_DOMAIN_URL}/app/auth`,
            { userName: credentials.username.replace(/\s/g, ''), pwd: credentials.password },
            {
              headers: { "Content-Type": "application/json" },
              withCredentials: true,
            }
          )
          .then(function (response) {
            if (response?.data) {
              user = { ...response.data };
            }
          })
          .catch((error) => {
            if (error.response) {
              throw new Error(JSON.stringify({ errors: error?.response?.data?.message, status: false }))
            } else if (error.request) {
              throw new Error(JSON.stringify({ errors: 'Server error, please try again.', status: false }))
            } else {
              throw new Error(JSON.stringify({ errors: 'Network error, please try again.', status: false }))
            }
          });
        return user;
      },
    }),
  ],
  pages: {
    signIn: "/Auth/Login",
  },
  session: {
    strategy: "jwt" // jwt字段已废弃,只需保留strategy配置
  },
  jwt: {
    maxAge: 60 * 60 * 24 * 30 * 6,
  },
  secret: process.env.NEXT_AUTH_SECRET,

  callbacks: {
    async jwt({ token, user }) {
      // 用户登录时,将用户数据合并到Token中
      if (user) {
        token = { ...token, ...user };
      }
      return token;
    },
    async session({ session, token }) {
      // 从Token中取出用户信息,赋值给session.user
      if (token) {
        session.user = { ...token };
      }
      return session;
    },
  },
});

额外说明

  • 原代码中session.jwt配置已被废弃,只需保留session.strategy: "jwt"即可。
  • JWT Token会被安全存储在浏览器中,服务器刷新或标签页切换时,NextAuth会自动从Token中恢复会话数据,不会丢失。

内容的提问来源于stack exchange,提问作者Firas SCMP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:20:31