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

如何扩展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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 00:48:17