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

