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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:27:10