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

Vercel预览环境下Next-auth每次请求都运行该如何处理?

Next.js Vercel部署next-auth全局拦截非授权API问题排查方案

第一步:校验middleware.ts配置

  • 检查你是否在根目录配置了全局生效的next-auth middleware,默认的auth()中间件会拦截所有请求,没有在matcher里排除的公开路由都会被先执行身份校验
  • 需要在middleware的matcher里明确排除不需要鉴权的端点,比如注册接口/api/register这类公开接口,参考配置示例:
export { auth as middleware } from "@/auth"
 
export const config = {
  matcher: [
    /*
     * 匹配所有请求路径,排除以下不需要鉴权的路径:
     * 1. 所有公开静态资源后缀
     * 2. 首页、注册、登录等公开页面
     * 3. /api/auth开头的next-auth自带接口、/api/register这类公开API
     */
    '/((?!_next/static|_next/image|favicon.ico|api/auth|api/register|login|register).*)',
  ],
}

第二步:校验API路由的鉴权逻辑封装

  • 检查你是否对所有API路由做了统一的鉴权封装,比如给所有handler外层套了withAuth高阶函数,没有给公开接口单独跳过校验
  • 如果是使用App Router的路由处理函数,检查是否在函数开头统一调用了await auth()校验,没有对公开路由单独做判断跳过

第三步:校验next-auth callbacks配置

  • 检查auth.ts里的authorized回调逻辑,是否有错误的全量拦截规则,没有放行公开路径的请求,参考正确配置:
export const { handlers, auth, signIn, signOut } = NextAuth({
  providers: [/* 你的provider配置 */],
  callbacks: {
    authorized({ request, auth }) {
      const { pathname } = request.nextUrl
      // 明确放行公开路径
      if (pathname.startsWith('/api/register') || pathname === '/register') return true
      // 其他路径需要鉴权
      return !!auth
    }
  }
})

第四步:校验Vercel环境变量配置

  • 确认你在Vercel预览环境的环境变量面板里,已经配置了正确的NEXTAUTH_SECRET,这个值如果缺失或者错误,会导致next-auth校验逻辑异常触发拦截
  • 确认NEXTAUTH_URL配置的值和当前预览环境的域名完全匹配,不要带多余的后缀斜杠

第五步:本地模拟预览环境验证

  • 本地运行next build && next start启动生产模式验证问题,不要用开发模式next dev,开发模式的中间件匹配逻辑和生产环境存在差异,很多拦截问题只会在生产模式下复现
  • 开启next-auth debug日志,在auth.ts配置里添加debug: true,本地生产模式运行时查看控制台输出的拦截日志,确认请求被拦截的具体原因

内容的提问来源于stack exchange,提问作者Gogu Gogugogu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 09:06:04