You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

70 lines
1.8 KiB
TypeScript

import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server';
import { NextResponse } from 'next/server';
import { authEnv } from '@/config/auth';
import NextAuthEdge from '@/libs/next-auth/edge';
import { OAUTH_AUTHORIZED } from './const/auth';
export const config = {
matcher: [
// include any files in the api or trpc folders that might have an extension
'/(api|trpc)(.*)',
// include the /
'/',
'/chat(.*)',
'/settings(.*)',
'/files(.*)',
'/repos(.*)',
// ↓ cloud ↓
],
};
const defaultMiddleware = () => NextResponse.next();
// Initialize an Edge compatible NextAuth middleware
const nextAuthMiddleware = NextAuthEdge.auth((req) => {
// skip the '/' route
if (req.nextUrl.pathname === '/') return NextResponse.next();
// Just check if session exists
const session = req.auth;
// Check if next-auth throws errors
// refs: https://github.com/lobehub/lobe-chat/pull/1323
const isLoggedIn = !!session?.expires;
// Remove & amend OAuth authorized header
const requestHeaders = new Headers(req.headers);
requestHeaders.delete(OAUTH_AUTHORIZED);
if (isLoggedIn) requestHeaders.set(OAUTH_AUTHORIZED, 'true');
return NextResponse.next({
request: {
headers: requestHeaders,
},
});
});
const isProtectedRoute = createRouteMatcher([
'/settings(.*)',
'/files(.*)',
// ↓ cloud ↓
]);
export default authEnv.NEXT_PUBLIC_ENABLE_CLERK_AUTH
? clerkMiddleware(
(auth, req) => {
if (isProtectedRoute(req)) auth().protect();
},
{
// https://github.com/lobehub/lobe-chat/pull/3084
clockSkewInMs: 60 * 60 * 1000,
signInUrl: '/login',
signUpUrl: '/signup',
},
)
: authEnv.NEXT_PUBLIC_ENABLE_NEXT_AUTH
? nextAuthMiddleware
: defaultMiddleware;