Files
kalendartool/app/auth/hub/route.ts

55 lines
1.9 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* GET /auth/hub?token=... – SSO-Einstiegspunkt der MultiToolApp-Plattform.
*
* Ablauf (platform-plan.md §5.2):
* 1. Hub-Token validieren (RS256 via JWKS vom Hub, aud = HUB_TOOL_SLUG)
* 2. JIT-Provisioning (Account an hubId koppeln oder anlegen)
* 3. Eigene Session setzen (bewährtes calendar_session-Cookie)
* 4. Redirect auf das Kalender-Dashboard
*
* Fehler → Redirect auf /login mit ?hubError=... (keine Details im Query,
* nur grober Code; Details stehen im Server-Log).
*/
import { NextRequest, NextResponse } from "next/server";
import { verifyHubToken } from "@/lib/auth/hub";
import { provisionHubUser } from "@/lib/auth/hub-provisioning";
import { createSessionToken, setSessionCookie } from "@/lib/auth/session";
/** basePath der App (Proxy-Modus) – Redirect-Ziele müssen darunter liegen. */
function getBasePath(): string {
return (process.env.HUB_BASE_PATH ?? "").replace(/\/$/, "");
}
export async function GET(request: NextRequest) {
const basePath = getBasePath();
const loginUrl = new URL(`${basePath}/login`, request.url);
try {
const token = request.nextUrl.searchParams.get("token");
if (!token) {
loginUrl.searchParams.set("hubError", "missing_token");
return NextResponse.redirect(loginUrl);
}
// 1. Token validieren (Signatur/TTL/aud/iss)
const identity = await verifyHubToken(token);
// 2. JIT-Provisioning
const user = await provisionHubUser(identity);
// 3. Eigene Session setzen
const sessionToken = await createSessionToken({
id: user.id,
email: user.email,
role: user.role,
});
await setSessionCookie(sessionToken);
// 4. Weiter ins Tool (basePath-kompatibel)
return NextResponse.redirect(new URL(`${basePath}/`, request.url));
} catch (error) {
console.error("Hub-SSO fehlgeschlagen:", error);
loginUrl.searchParams.set("hubError", "invalid_token");
return NextResponse.redirect(loginUrl);
}
}