36 lines
1.3 KiB
JavaScript
36 lines
1.3 KiB
JavaScript
import { createServerClient } from "@supabase/ssr";
|
|
import { NextResponse } from "next/server";
|
|
|
|
const PUBLIC_PATHS = ["/login", "/auth"];
|
|
|
|
export async function middleware(request) {
|
|
const pathname = request.nextUrl.pathname;
|
|
if (PUBLIC_PATHS.some((path) => pathname === path || pathname.startsWith(`${path}/`))) {
|
|
return NextResponse.next();
|
|
}
|
|
|
|
let response = NextResponse.next({ request });
|
|
const supabase = createServerClient(
|
|
process.env.NEXT_PUBLIC_SUPABASE_URL,
|
|
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY,
|
|
{
|
|
cookies: {
|
|
getAll: () => request.cookies.getAll(),
|
|
setAll(cookiesToSet) {
|
|
cookiesToSet.forEach(({ name, value, options }) => request.cookies.set(name, value));
|
|
response = NextResponse.next({ request });
|
|
cookiesToSet.forEach(({ name, value, options }) => response.cookies.set(name, value, options));
|
|
},
|
|
},
|
|
},
|
|
);
|
|
const { data: { user } } = await supabase.auth.getUser();
|
|
if (user) return response;
|
|
if (pathname.startsWith("/api/")) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
const loginUrl = request.nextUrl.clone();
|
|
loginUrl.pathname = "/login";
|
|
loginUrl.searchParams.set("next", pathname);
|
|
return NextResponse.redirect(loginUrl);
|
|
}
|
|
|
|
export const config = { matcher: ["/((?!_next/static|_next/image|favicon.ico).*)"] }; |