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

NextAuth生产环境下Middleware无法获取Token问题求助

NextAuth Credentials Provider生产环境Middleware无法获取Token问题排查与修复

问题场景

在Next.js应用中使用自定义Credentials Provider的NextAuth,本地开发环境登录后Token可正常获取,Middleware逻辑运行正常;但部署到Vercel生产环境后,登录成功后Middleware始终无法获取Token(日志显示Token retrieved: null),导致用户被卡在登录页面。

已排查内容

  • 确认Vercel环境变量中NEXTAUTH_SECRET已正确配置
  • 生产环境已启用安全Cookie
  • 添加了详细日志追踪Token获取流程
  • NextAuth的JWT和Session回调已正常生成完整Token(日志验证Token结构无问题)

可能原因分析

  1. Cookie配置不匹配生产环境要求:生产环境为HTTPS,需显式设置secure属性为true,同时Cookie的domain需匹配Vercel域名,否则浏览器不会携带Cookie到服务器。
  2. NEXTAUTH_URL未配置:生产环境必须指定NEXTAUTH_URL为应用完整域名,否则NextAuth生成的Cookie路径或域会出现错误。
  3. Middleware中getToken参数缺失:未明确指定生产环境的Cookie名称,导致无法正确读取带__Secure-前缀的Cookie。
  4. Vercel Edge缓存影响:Middleware可能被缓存,导致Cookie未正确传递到后续请求。

修复步骤

1. 完善NextAuth的Cookie配置

在authOptions中添加适配生产环境的Cookie配置,确保Cookie属性符合HTTPS环境要求:

export const authOptions = {
  // ...现有providers、callbacks等配置
  cookies: {
    sessionToken: {
      name: `${process.env.NODE_ENV === "production" ? "__Secure-" : ""}next-auth.session-token`,
      options: {
        httpOnly: true,
        sameSite: "lax",
        path: "/",
        secure: process.env.NODE_ENV === "production",
        // 替换为你的Vercel域名:自定义域名填.your-domain.com,Vercel默认域名填.vercel.app
        domain: process.env.NODE_ENV === "production" ? ".your-vercel-domain.com" : undefined,
      },
    },
  },
  // ...其他配置(secret、session等)
};

2. 配置NEXTAUTH_URL环境变量

在Vercel控制台的环境变量中添加NEXTAUTH_URL,值为生产环境完整域名(例如https://your-project.vercel.app),添加后重新部署应用确保变量生效。

3. 修正Middleware中getToken的调用

显式指定生产环境的Cookie名称,确保与NextAuth配置一致:

let token;
try {
  const cookieName = process.env.NODE_ENV === "production" 
    ? "__Secure-next-auth.session-token" 
    : "next-auth.session-token";
  
  token = await getToken({
    req: request,
    secret: process.env.NEXTAUTH_SECRET,
    cookieName,
  });
  console.log("Token retrieved:", token);
} catch (error) {
  console.error("Error retrieving token:", error);
  return NextResponse.redirect(new URL("/Login", request.url));
}

4. 禁用Middleware缓存

在Middleware中添加Cache-Control头,避免Vercel Edge缓存导致Cookie传递异常:

// 替换原有的return NextResponse.next();
const response = NextResponse.next();
response.headers.set("Cache-Control", "no-store, max-age=0");
return response;

5. 验证环境变量一致性

确保Vercel中的NEXTAUTH_SECRET与本地开发环境使用的密钥完全一致,避免因密钥不匹配导致Token无法解密。

本地与生产环境差异说明

本地开发使用HTTP协议,Cookie不需要secure属性,且domain默认为localhost,浏览器会正常携带;而生产环境为HTTPS,必须启用secure Cookie,同时需要匹配正确的域名才能让浏览器在请求时携带Cookie,这是导致本地正常、生产异常的核心原因。

内容的提问来源于stack exchange,提问作者Aditya Salve

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 01:12:35