NextAuth中间件仅导出默认值失效问题求助(Next.js 13 + NextAuth 4)
NextAuth中间件无限重定向问题解决办法
问题原因
当你只在middleware.ts中导出next-auth/middleware的默认值而不配置matcher时,中间件会拦截所有路由,包括你自定义的/login登录页和NextAuth的/api/auth相关接口。未登录用户访问受保护路由会被重定向到/login,但中间件又会拦截/login,认为这也是需要认证的路径,于是再次重定向,最终导致callbackUrl无限嵌套的循环问题。
解决方案
1. 精准配置matcher指定受保护路由
在middleware.ts中明确设置需要保护的路由,只让中间件拦截这些路径,放过登录页和认证接口:
export { default } from "next-auth/middleware"; // 只保护/dashboard下的所有子路由,可根据需求添加其他路径 export const config = { matcher: ["/dashboard/:path*"] };
如果需要保护多个路由,直接在数组里添加即可,比如:
matcher: ["/dashboard/:path*", "/profile/:path*", "/settings"]
2. 确认NextAuth登录页配置正确
检查/api/auth/[...nextauth]/route.ts中的pages.signIn是否准确指向你的自定义登录页,避免重定向目标错误:
import NextAuth from "next-auth"; import CredentialsProvider from "next-auth/providers/credentials"; const handler = NextAuth({ providers: [ CredentialsProvider({ name: "Credentials", credentials: { // 你的凭证字段定义 }, async authorize(credentials) { // 你的自定义身份验证逻辑 // 验证通过返回用户对象,失败返回null } }) ], pages: { signIn: "/login" // 确保这里路径正确,不要带多余的斜杠或拼写错误 }, session: { strategy: "jwt" // CredentialsProvider建议用jwt策略 } }); export { handler as GET, handler as POST };
额外说明
NextAuth中间件的默认行为是匹配所有路由,这在大部分场景下并不适用,因为登录页、公共页面和认证接口本身不需要被拦截保护。通过matcher精准指定受保护路径,是避免无限重定向的核心关键。
内容的提问来源于stack exchange,提问作者NoobMaster69
相关产品推荐
相关产品推荐

