KeySuiteTrousseau
Guides

SSO Logout

Implémentez le RP-Initiated Logout et le Backchannel Logout avec Trousseau.

Vue d'ensemble

Trousseau prend en charge deux mécanismes de déconnexion :

  1. RP-Initiated Logout: Votre application redirige l'utilisateur vers l'endpoint end-session de Trousseau
  2. Backchannel Logout: Trousseau notifie votre application lorsqu'un utilisateur se déconnecte depuis une autre application

RP-Initiated Logout

Lorsque votre utilisateur clique sur "Se déconnecter", vous devez :

  1. Effacer la session de votre application (cookies, store de session côté serveur)
  2. Rediriger vers l'endpoint end-session de Trousseau pour terminer la session SSO

URL de déconnexion

GET https://auth.trousseau.app/application/o/{your-slug}/end-session/
  ?id_token_hint={id_token}
  &post_logout_redirect_uri=https://app.yourapp.com/signed-out
ParamètreObligatoireDescription
id_token_hintRecommandéL'ID token de la session utilisateur. Permet à Trousseau d'identifier quelle session invalider.
post_logout_redirect_uriRecommandéVers où rediriger l'utilisateur après la déconnexion. Doit être une URI de redirection enregistrée.

Flux

L'utilisateur clique sur "Se déconnecter"
  → Votre application efface sa propre session
  → Redirection vers Trousseau /end-session/
  → Trousseau invalide la session SSO
  → Trousseau redirige vers post_logout_redirect_uri
  → L'utilisateur voit votre page de déconnexion

Exemple (Next.js)

export async function logout() {
  const session = await getSession();
  const idToken = session?.idToken;

  // Effacer la session de votre application
  await destroySession();

  // Rediriger vers l'endpoint end-session de Trousseau
  const logoutUrl = new URL(
    `${process.env.OIDC_ISSUER}end-session/`
  );
  logoutUrl.searchParams.set("id_token_hint", idToken);
  logoutUrl.searchParams.set(
    "post_logout_redirect_uri",
    "https://app.yourapp.com/signed-out"
  );

  redirect(logoutUrl.toString());
}

Backchannel Logout

Le Backchannel Logout permet à Trousseau de notifier votre application lorsqu'un utilisateur se déconnecte depuis une autre application connectée à Trousseau (ou directement depuis Trousseau).

Fonctionnement

  1. L'utilisateur se déconnecte d'une autre application connectée à Trousseau
  2. Trousseau envoie un JWT signé (logout_token) à votre endpoint de backchannel logout via POST
  3. Votre application valide le token et détruit toutes les sessions de cet utilisateur

Configuration

Enregistrez une URL de backchannel logout lors de l'intégration :

https://app.yourapp.com/api/auth/backchannel-logout

Implémentation de l'endpoint

export async function POST(request: Request) {
  const body = await request.formData();
  const logoutToken = body.get("logout_token") as string;

  // 1. Valider la signature JWT via le JWKS de Trousseau
  const payload = await validateLogoutToken(logoutToken);

  // 2. Extraire le claim sub de l'utilisateur
  const userId = payload.sub;

  // 3. Détruire toutes les sessions de cet utilisateur
  await destroyUserSessions(userId);

  return new Response(null, { status: 200 });
}

Claims du logout token

ClaimDescription
issURL de l'émetteur Trousseau
subIdentifiant de l'utilisateur déconnecté
audVotre client ID
iatHeure d'émission du token
jtiIdentifiant unique du token (prévention du rejeu)
eventsContient http://schemas.openid.net/event/backchannel-logout

Validez toujours la signature du logout token avant de le traiter. Un token non validé pourrait être utilisé pour déconnecter de force vos utilisateurs.

Bonnes pratiques

  • Implémentez au minimum le RP-Initiated Logout
  • Stockez l'id_token dans la session serveur pour le rendre disponible au moment de la déconnexion
  • Implémentez le Backchannel Logout pour une meilleure expérience utilisateur dans l'écosystème
  • Retournez HTTP 200 depuis l'endpoint backchannel même si l'utilisateur n'a pas de session active (idempotence)