mirror of
https://github.com/tiennm99/llmapikey.git
synced 2026-06-17 10:47:55 +00:00
02fa52ccf9
- Next.js 15 App Router (JS+JSDoc): landing, auth-gated dashboard, docs - GitHub OAuth via Supabase; identity anchored on numeric provider_id - key provisioning: reserve-then-mint-persist-compensate, one key per account - api_keys in unexposed llmapikey schema via direct Postgres; RLS deny-all - live minting gated behind PROVISIONING_ENABLED; Vercel auto-deploy disabled - unit tests (mask, request-body), RLS deny-all test, reconcile script
42 lines
1.3 KiB
JavaScript
42 lines
1.3 KiB
JavaScript
import { createServerClient } from "@supabase/ssr";
|
|
import { NextResponse } from "next/server";
|
|
|
|
/**
|
|
* Refresh the Supabase auth session on each request so server components and
|
|
* actions see a valid token. Reads/writes session cookies via the request and
|
|
* response (middleware can't use next/headers cookies()).
|
|
*
|
|
* @param {import('next/server').NextRequest} request
|
|
*/
|
|
export async function middleware(request) {
|
|
let response = NextResponse.next({ request });
|
|
|
|
const url = process.env.NEXT_PUBLIC_SUPABASE_URL;
|
|
const anonKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY;
|
|
if (!url || !anonKey) return response; // no auth configured yet
|
|
|
|
const supabase = createServerClient(url, anonKey, {
|
|
cookies: {
|
|
getAll() {
|
|
return request.cookies.getAll();
|
|
},
|
|
setAll(cookiesToSet) {
|
|
for (const { name, value } of cookiesToSet) {
|
|
request.cookies.set(name, value);
|
|
}
|
|
response = NextResponse.next({ request });
|
|
for (const { name, value, options } of cookiesToSet) {
|
|
response.cookies.set(name, value, options);
|
|
}
|
|
},
|
|
},
|
|
});
|
|
|
|
await supabase.auth.getUser();
|
|
return response;
|
|
}
|
|
|
|
export const config = {
|
|
matcher: ["/((?!_next/static|_next/image|favicon.ico|.*\\.(?:svg|png|ico)$).*)"],
|
|
};
|