// Auteur : Simon-Pierre Boucher — contact@spboucher.ai // « Se connecter avec KA » — endpoint SSO du hub. // Une plateforme du groupe (ex. Lou·Ka) envoie l'utilisateur ici ; // s'il a une session KA ID (créée par courriel ou via Google), on lui // remet un jeton signé (HS256, secret partagé avec la plateforme) qui // transporte son profil, puis on le renvoie vers la plateforme. import { NextRequest, NextResponse } from "next/server"; import { SignJWT } from "jose"; import { getSessionUser, BASE_URL } from "@/lib/auth"; import { SSO_CLIENTS } from "@/lib/sso"; import { ensureKaId } from "@/lib/db"; export async function GET(req: NextRequest) { const clientId = req.nextUrl.searchParams.get("client_id") ?? ""; const redirectUri = req.nextUrl.searchParams.get("redirect_uri") ?? ""; const state = req.nextUrl.searchParams.get("state") ?? ""; const client = SSO_CLIENTS[clientId]; if (!client) return NextResponse.json( { error: `client_id inconnu : ${clientId}` }, { status: 400 }, ); if (!client.redirectPrefixes.some((p) => redirectUri.startsWith(p))) return NextResponse.json( { error: "redirect_uri non autorisé pour ce client." }, { status: 400 }, ); const secret = process.env[client.secretEnv]; if (!secret) return NextResponse.json( { error: `Secret SSO non configuré pour ${clientId}.` }, { status: 500 }, ); const user = await getSessionUser(); if (!user) { // Pas de session hub → page de connexion, puis retour ici. const back = req.nextUrl.pathname + "?" + req.nextUrl.searchParams.toString(); return NextResponse.redirect( new URL(`/connexion?next=${encodeURIComponent(back)}&via=${clientId}`, BASE_URL), ); } const token = await new SignJWT({ sub: String(user.id), ka_id: ensureKaId(user.id), email: user.email, name: user.name, picture: user.avatarUrl, provider: user.hasGoogle ? "google" : user.hasApple ? "apple" : "password", ka_role: user.role, }) .setProtectedHeader({ alg: "HS256" }) .setIssuer(BASE_URL) .setAudience(clientId) .setIssuedAt() .setExpirationTime("5m") .sign(new TextEncoder().encode(secret)); const dest = new URL(redirectUri); dest.searchParams.set("ka_token", token); if (state) dest.searchParams.set("state", state); return NextResponse.redirect(dest); }