Next.js 14.0.3 + NextAuth 4.24.4生产环境刷新丢失Token求助
问题修复方案
1. 修复JWT回调的Token处理逻辑
当前代码在非cognito_google provider场景下直接覆盖整个token对象,丢失了NextAuth维护的核心字段(如iat、exp、jti),生产环境下这些字段缺失会导致session无法被正确解析。修改为合并用户信息到原有token,而非完全替换:
async jwt({ token, user, account, profile, isNewUser }) { console.log("jwtCallback_Token", token); console.log("jwtCallback_User", user); console.log("jwtCallback_Account", account); // 用户首次登录(存在account)时,合并用户信息到token,保留核心字段 if (account) { if (account.provider !== "cognito_google") { token = { ...token, ...user }; } else if (account.provider === "cognito_google") { token = { ...token, id_token: account.id_token, access_token: account.access_token, refresh_token: account.refresh_token, cust_exp: user?.exp, picture: user?.picture, email_verified: user?.email_verified, email: user?.email, sub: user?.sub, name: user?.name }; } } return token; },
2. 完善Session回调的同步逻辑
确保session能完整获取token中的必要字段,同时处理session为空的边界情况:
async session({ session, token, user }) { console.log("session-s", session); console.log("session-t", token); console.log("session-u", user); if (session) { session.access_token = token.access_token; // 同步前端需要的用户字段 session.user = { ...session.user, email: token.email, name: token.name, picture: token.picture, email_verified: token.email_verified }; session.id_token = token.id_token; } return session; },
3. 优化客户端useSession调用
在客户端组件中,给useSession添加reloadOnMount: true配置,强制页面加载时主动拉取最新session,避免依赖缓存:
const { data: session, status } = useSession({ reloadOnMount: true, // 若需强制用户登录,可添加required: true,会自动跳转登录页 // required: true });
4. 确认Session策略配置
确保NextAuth配置中明确设置JWT策略,并匹配token有效期:
export default NextAuth({ providers: [/* 你的provider配置 */], session: { strategy: "jwt", maxAge: 24 * 60 * 60, // 根据实际token有效期调整 }, callbacks: { jwt: /* 修改后的jwt回调 */, session: /* 修改后的session回调 */, }, });
问题根源
开发模式下NextAuth的session验证逻辑较宽松,允许缺失部分核心字段;但生产模式会严格校验JWT的有效性(包括exp、iat等字段),原代码直接替换token对象导致这些字段丢失,刷新页面时无法恢复session。切换标签时浏览器触发重新渲染,NextAuth重新尝试同步session,此时可能通过refresh_token重新获取了有效token,因此session恢复。
内容的提问来源于stack exchange,提问作者Lelouch Lamperouge
相关产品推荐
相关产品推荐

