// Auteur : Simon-Pierre Boucher — contact@spboucher.ai // Retour SSO KA ID : vérifie le state signé localement puis le ka_token du hub // (JWT HS256 — signature KA_SSO_SECRET, alg, iss, aud, exp), pose la session // locale (cookie httpOnly tk_ka_session signé HMAC-SHA256, 30 jours) et // redirige vers la destination demandée (ou l'accueil). import { NextRequest, NextResponse } from "next/server"; import { KA_BASE_URL, SESSION_COOKIE, SESSION_DAYS, sessionFromClaims, verifyKaToken, verifyState, } from "@/lib/ka-auth"; export function GET(req: NextRequest) { const q = req.nextUrl.searchParams; const state = verifyState(q.get("state") ?? ""); if (!state) { return NextResponse.json( { error: "state invalide ou expiré — recommencez la connexion" }, { status: 400 }, ); } const claims = verifyKaToken(q.get("ka_token") ?? ""); if (!claims) { return NextResponse.json( { error: "jeton KA invalide ou expiré — recommencez la connexion" }, { status: 401 }, ); } const made = sessionFromClaims(claims); if (!made) { return NextResponse.json( { error: "jeton KA incomplet (ka_id manquant)" }, { status: 401 }, ); } const res = NextResponse.redirect(new URL(state.next, KA_BASE_URL)); res.cookies.set(SESSION_COOKIE, made.value, { httpOnly: true, secure: KA_BASE_URL.startsWith("https"), sameSite: "lax", path: "/", maxAge: SESSION_DAYS * 86400, }); return res; }