如何扩展NextRequest添加auth属性?Next.js14中间件认证问题
解决Next.js 14堆叠中间件中next-auth v5的req.auth未定义与TypeScript类型问题
1. 调整堆叠中间件的执行与传递逻辑
next-auth v5的auth中间件需要优先执行,且必须将处理后的request传递给后续中间件,不能直接返回响应(除非是拦截未认证请求的场景)。
示例核心结构:
- 根目录
middleware.ts(入口中间件):
import { auth } from '@/lib/authMiddleware'; import { i18nMiddleware } from '@/lib/i18nMiddleware'; export default async function middleware(request: Request) { // 先执行auth中间件,获取附加auth属性的request const processedRequest = await auth(request); // 将处理后的request传入本地化中间件 return i18nMiddleware(processedRequest as Request); } export const config = { matcher: ['/((?!api|_next/static|_next/image|favicon.ico).*)'], };
authMiddleware.ts(认证中间件):
import { NextRequest, NextResponse } from 'next/server'; import { getAuth } from '@auth/core'; export async function auth(request: NextRequest) { const authData = await getAuth(request); // 安全地为request附加auth属性 (request as NextRequest & { auth: typeof authData }).auth = authData; // 未认证拦截逻辑(按需添加) if (!authData && request.nextUrl.pathname !== '/login') { return NextResponse.redirect(new URL('/login', request.url)); } // 返回处理后的request供后续中间件使用 return request; }
2. 正确扩展TypeScript类型,避免冲突
不要直接全局扩展NextRequest,通过模块扩展增强官方类型,这是Next.js类型扩展的标准方式:
在项目根目录创建types/next-auth-extend.d.ts(或现有类型文件):
import type { DefaultSession } from '@auth/core/types'; import type { NextRequest } from 'next/server'; // 扩展next/server模块中的NextRequest接口 declare module 'next/server' { interface NextRequest { auth?: DefaultSession | null; } }
确保tsconfig.json包含该类型文件:
{ "compilerOptions": { "typeRoots": ["./types", "./node_modules/@types"] } }
如果使用自定义session类型,将DefaultSession替换为你的自定义类型即可。
3. 排查next-auth v5配置问题
- 确保
auth.ts(next-auth配置文件)正确导出实例,且配置了必填的secret和提供者:
import NextAuth from '@auth/core'; import Credentials from '@auth/core/providers/credentials'; export const { auth, handlers, signIn, signOut } = NextAuth({ secret: process.env.AUTH_SECRET, providers: [ Credentials({ async authorize(credentials) { // 自定义凭证验证逻辑,返回用户信息或null }, }), ], });
- 避免在auth中间件中提前返回
NextResponse(除了拦截场景),否则后续中间件无法拿到带auth属性的request。
4. 确认中间件执行顺序
必须保证auth中间件先执行,再执行本地化中间件。如果顺序颠倒,本地化中间件会先处理未附加auth属性的request,导致auth未定义。
内容的提问来源于stack exchange,提问作者xXnikosXx
相关产品推荐
相关产品推荐

