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*' ] };
关键逻辑说明
- 国际化优先处理:先调用next-intl的中间件处理路由重定向(比如自动跳转到用户偏好语言的路径),如果返回了重定向响应,直接返回该响应,确保国际化逻辑优先执行。
- 受保护路由校验:通过
routing.localePattern提取去掉语言前缀后的路径,判断是否匹配受保护路由规则,避免因语言前缀导致的匹配失效。 - 认证重定向适配:配置Kinde的
loginUrl时带上默认语言前缀,保证未认证用户跳转到对应语言的登录页面。 - 匹配规则合并:将两个中间件的
matcher规则合并,确保所有需要处理的路由都被当前中间件覆盖。
注意事项
- 确保
@/i18n/routing中的locales数组包含你实际支持的语言(比如en、fr、ar)。 - 如果需要新增受保护路由,直接添加到
protectedPaths数组即可,无需修改其他逻辑。 - 若Kinde的认证需要自定义未授权逻辑,可以在
withAuth的回调中扩展处理。
内容的提问来源于stack exchange,提问作者codeonym
相关产品推荐
相关产品推荐

