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

NextAuth Middleware在Next.js 13 App Router中无法正常工作求助

问题:NextAuth中间件无法拦截未授权用户访问页面

我正在尝试实现NextAuth的Middleware功能,用来阻止未授权用户通过手动输入URL访问任意页面,但目前这个功能完全不起作用。我已经试过所有能想到的解决办法,包括:

  • 给整个应用配置了SessionProvider,在根布局的body标签里包裹了所有内容,同时配置了app/api/auth/[...nextauth]/route.ts,代码如下:
import NextAuth, { User } from "next-auth";
import { JWT } from "next-auth/jwt";
import CredentialsProvider from "next-auth/providers/credentials";

const handler = NextAuth({
  providers: [
    CredentialsProvider({
      name: "Credentials",
      credentials: {
        email: { label: "Email", type: "email" },
        password: { label: "Password", type: "password" },
      },
      async authorize(credentials, req) {
        const res = await fetch(`${process.env.NEXT_PUBLIC_API_BASE_URL}/auth/login/`, {
          method: "POST",
          headers: { "Content-Type": "application/json" },
          body: JSON.stringify({
            email: credentials?.email,
            password: credentials?.password,
          }),
        });

        const user = await res.json();

        // 如果响应里有"detail"字段,说明API返回登录失败
        if (!user.detail) {
          const userWithTokens: User = {
            ...user,
            accessToken: user?.access,
            refreshToken: user?.refresh,
          };
          return userWithTokens;
        } else {
          throw new Error("Invalid credentials");
        }
      },
    }),
  ],
  // 用自定义页面替换NextAuth默认页面
  pages: {
    signIn: "/auth/signin",
    signOut: "/auth/signin",
    error: "/auth/signin",
  },
  session: {
    strategy: "jwt",
  },
  callbacks: {
    async jwt({ token, user }) {
      // 首次登录
      if (user) {
        token.accessToken = user.accessToken;
        token.refreshToken = user.refreshToken;

        return token;
      } else if (token?.refreshToken) {
        // 访问令牌过期,尝试刷新
        const res = await fetch(`${process.env.NEXT_PUBLIC_API_BASE_URL}/auth/refresh/`, {
          method: "POST",
          headers: {
            "Content-Type": "application/json",
          },
          body: JSON.stringify({
            refresh: token.refreshToken,
          }),
        });

        const newToken = await res.json();

        if (newToken.access) {
          token = {
            ...token,
            accessToken: newToken.access,
          };
        }
      }

      return token;
    },
    async session({ session, token }) {
      // 给session添加自定义属性
      session.accessToken = token.accessToken as JWT;
      return session;
    },
  },
});

export { handler as GET, handler as POST };
  • 配置了环境变量,包括NEXTAUTH_SECRET、开发环境下的NEXTAUTH_URL=localhost:3000、SECRET_KEY等;

  • 在和app目录同级的位置创建了middleware.ts文件,代码如下:

export { default } from "next-auth/middleware";

export const config = {
  matcher: [
    // 匹配所有请求路径,除了/auth/*开头的
    "/((?!auth).*)",
  ],
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 23:33:21