Nach dem Abmelden landete man auf 0.0.0.0:3000, weil die absolute Redirect-URL aus request.url gebaut wurde und dort seit der Bindung an 0.0.0.0 die Server-Adresse statt des aufgerufenen Hosts steht. Logout leitet jetzt relativ weiter; der Proxy baut die URL aus dem Host-Header des Browsers (inkl. x-forwarded-proto hinter Proxies).
50 lines
1.5 KiB
TypeScript
50 lines
1.5 KiB
TypeScript
import { createServerClient } from "@supabase/ssr";
|
|
import { NextResponse, type NextRequest } from "next/server";
|
|
|
|
// Session-Refresh + Zugriffsschutz für die internen Bereiche.
|
|
export async function proxy(request: NextRequest) {
|
|
let response = NextResponse.next({ request });
|
|
|
|
const supabase = createServerClient(
|
|
process.env.NEXT_PUBLIC_SUPABASE_URL!,
|
|
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
|
|
{
|
|
cookies: {
|
|
getAll() {
|
|
return request.cookies.getAll();
|
|
},
|
|
setAll(cookiesToSet) {
|
|
cookiesToSet.forEach(({ name, value }) =>
|
|
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) {
|
|
// Absolute URL aus dem Host-Header des Browsers bauen: request.nextUrl
|
|
// trägt bei "-H 0.0.0.0" die Server-Bindung statt des aufgerufenen
|
|
// Hosts, und relative Location-Header lehnt die Middleware ab.
|
|
const host = request.headers.get("host") ?? request.nextUrl.host;
|
|
const proto =
|
|
request.headers.get("x-forwarded-proto") ??
|
|
request.nextUrl.protocol.replace(":", "");
|
|
return NextResponse.redirect(`${proto}://${host}/login`, 303);
|
|
}
|
|
|
|
return response;
|
|
}
|
|
|
|
export const config = {
|
|
matcher: ["/intern/:path*", "/admin/:path*", "/konto/:path*"],
|
|
};
|