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
相关产品推荐
相关产品推荐

