开发环境下Next.js中NextAuth会话数据丢失问题求助
问题分析与解决方案
核心问题出在**全局变量userInfo**上:
- 开发环境下,Next.js会在文件变更或服务器刷新时进行热重载,模块会重新执行,全局变量
userInfo会被重新初始化为空对象,导致会话数据丢失。 - 生产环境中代码是一次性构建完成的,模块不会频繁重新加载,所以全局变量的状态能暂时保留,但这其实也是不安全的实践(比如多实例部署时同样会丢失数据)。
修复步骤
- 删除全局的
userInfo变量,所有用户数据都通过JWT Token传递。 - 修改
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
相关产品推荐
相关产品推荐

