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

Nextjs 12.1.6中间件校验用户授权状态及远程失效问题求助

解决方案

针对你遇到的Next.js 12.1.6 + next-auth 4.10.0中间件部署后失效的问题,可从以下几个关键方面修复:

1. 修正中间件文件位置

Next.js 12.1.6要求_middleware.ts必须放在**pages目录的根目录**(即pages/_middleware.ts),不能放在pages的子文件夹中。部署环境下,非根目录的中间件不会被Next.js识别执行,这是本地正常但部署失效的常见原因。

2. 使用next-auth官方方法验证授权状态

不要硬编码cookie名称(本地和生产环境的next-auth session cookie名称可能不同,比如生产环境可能是__Secure-next-auth.session-token),改用next-auth提供的getToken方法自动处理token读取:

修改后的中间件代码

import { NextRequest, NextResponse } from 'next/server';
import { getToken } from 'next-auth/jwt';

export async function middleware(req: NextRequest) {
  // 从请求中获取token,secret需与next-auth配置的NEXTAUTH_SECRET一致
  const token = await getToken({ req, secret: process.env.NEXTAUTH_SECRET });

  // 判断当前是否在登录页,避免循环重定向
  const isLoginPage = req.nextUrl.pathname.startsWith('/login');

  // 未认证且不在登录页时,重定向到登录页
  if (!token && !isLoginPage) {
    return NextResponse.redirect(new URL('/login', req.url));
  }

  // 已认证或在登录页,继续处理请求
  return NextResponse.next();
}

export const config = {
  // 匹配需要校验的路径,包含/login防止循环重定向
  matcher: ['/account/:path*', '/login'],
};

3. 用redirect替代rewrite

你之前使用NextResponse.rewrite是服务器端URL重写,浏览器地址栏不会更新,可能导致用户刷新后回到原未授权路径。改用NextResponse.redirect会触发客户端跳转,地址栏更新为/login,符合登录跳转的预期行为。

4. 确保生产环境配置正确

  • 确认生产环境已设置NEXTAUTH_SECRET环境变量,该值需与next-auth配置文件中的secret一致,否则getToken无法验证token有效性。
  • 生产环境需使用HTTPS,next-auth在生产环境默认设置secure属性的cookie,HTTP环境下这类cookie无法被正确读取。

内容的提问来源于stack exchange,提问作者mirja-t

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 23:47:09