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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 13:20:32