Next.js14/15 + NextAuth v5 受保护路由实现及Middleware会话异常
问题解决:NextAuth中间件无法获取Session并报错
核心问题分析
你的auth.ts代码缺少必须的身份验证提供商(Providers)配置,NextAuth v5要求必须指定至少一个登录提供商才能完成初始化,这是导致报错的核心原因。另外,建议给中间件明确设置路由匹配规则,避免无差别拦截所有请求(比如静态资源、API路由等)。
修正后的代码示例
1. 完善auth.ts配置(添加Providers)
// auth.ts import NextAuth from "next-auth" import Credentials from "next-auth/providers/credentials" // 可根据需求替换为Google、GitHub等官方支持的提供商 export const { auth, handlers, signIn, signOut } = NextAuth({ // 必须配置至少一个登录提供商 providers: [ Credentials({ credentials: { email: { label: "邮箱", type: "email" }, password: { label: "密码", type: "password" } }, // 自定义用户验证逻辑,需替换为你的业务逻辑 async authorize(credentials) { if (!credentials?.email || !credentials?.password) return null // 示例:模拟验证通过后返回用户信息 return { id: "1", name: "测试用户", email: credentials.email } } }) ], callbacks: { authorized: async ({ auth }) => { // 已登录用户通过验证,否则触发重定向 return !!auth }, }, // 可选:指定Session存储策略,默认是JWT session: { strategy: "jwt" } })
2. 优化middleware.ts(添加路由匹配规则)
// middleware.ts import { auth } from "@/auth" // 明确指定中间件需要拦截的受保护路由,避免拦截无关请求 export const config = { matcher: ["/dashboard/:path*", "/profile/:path*"], // 替换为你的实际受保护路由 } export default auth((req) => { if (!req.auth && req.nextUrl.pathname !== "/login") { return Response.redirect(new URL("/login", req.nextUrl.origin)) } })
额外注意事项
- 确保安装的是NextAuth v5版本:
npm install next-auth@beta - 若使用数据库存储会话,需额外配置
adapter参数 - 确认
/login路由已创建并可正常访问
内容的提问来源于stack exchange,提问作者Sreenath Kumar
相关产品推荐
相关产品推荐

