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

Next.js 14 App Router中如何串联Kinde认证与next-intl中间件

在Next.js 14 App Router中合并next-intl与Kinde认证中间件

要同时处理国际化路由与受保护路由认证,你需要把两个中间件的逻辑链式整合到同一个文件中,优先处理国际化,再对指定路由应用认证校验。以下是完整的实现方案:

完整合并后的中间件代码

import createMiddleware from 'next-intl/middleware';
import { routing } from '@/i18n/routing';
import { withAuth } from "@kinde-oss/kinde-auth-nextjs/middleware";
import { NextResponse } from 'next/server';

// 初始化next-intl国际化中间件
const intlMiddleware = createMiddleware(routing);

export default function middleware(req: Request) {
  // 第一步:处理国际化路由重定向(比如根路径跳转到带语言前缀的路径)
  const intlResponse = intlMiddleware(req);
  if (intlResponse) {
    return intlResponse;
  }

  // 第二步:校验受保护路由的认证状态
  const protectedPaths = ['/dashboard', '/dashboard/:path*'];
  const url = new URL(req.url);
  const pathname = url.pathname;

  // 提取去掉语言前缀后的路径,用于匹配受保护路由规则
  const localeMatch = pathname.match(routing.localePattern);
  const pathWithoutLocale = localeMatch ? localeMatch.groups!.path : pathname;

  // 判断当前路径是否属于受保护路由
  const isProtected = protectedPaths.some(protectedPath => {
    return new URLPattern({ pathname: protectedPath }).test({ pathname: pathWithoutLocale });
  });

  if (isProtected) {
    return withAuth(req, {
      // 未认证时重定向到带当前语言前缀的登录页
      loginUrl: `${url.origin}/${routing.defaultLocale}/login`,
      // 明确指定需要认证的带语言前缀路由
      authorizedRoutes: protectedPaths.map(path => `/${routing.locales.join('|')}${path}`)
    });
  }

  // 非受保护路由直接放行
  return NextResponse.next();
}

// 合并路由匹配规则,覆盖所有需要处理的路径
export const config = {
  matcher: [
    // next-intl处理的国际化路由
    '/', '/(en|fr|ar)/:path*',
    // Kinde需要保护的路由(含多语言前缀)
    '/dashboard', '/(en|fr|ar)/dashboard/:path*'
  ]
};

关键逻辑说明

  1. 国际化优先处理:先调用next-intl的中间件处理路由重定向(比如自动跳转到用户偏好语言的路径),如果返回了重定向响应,直接返回该响应,确保国际化逻辑优先执行。
  2. 受保护路由校验:通过routing.localePattern提取去掉语言前缀后的路径,判断是否匹配受保护路由规则,避免因语言前缀导致的匹配失效。
  3. 认证重定向适配:配置Kinde的loginUrl时带上默认语言前缀,保证未认证用户跳转到对应语言的登录页面。
  4. 匹配规则合并:将两个中间件的matcher规则合并,确保所有需要处理的路由都被当前中间件覆盖。

注意事项

  • 确保@/i18n/routing中的locales数组包含你实际支持的语言(比如en、fr、ar)。
  • 如果需要新增受保护路由,直接添加到protectedPaths数组即可,无需修改其他逻辑。
  • 若Kinde的认证需要自定义未授权逻辑,可以在withAuth的回调中扩展处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 06:05:57