Keycloak-Logout ohne User-Bestätigung: Eine Anleitung
In modernen Anwendungen ist die Abmeldung ein zentraler Bestandteil der Benutzerverwaltung. Im Kontext von OpenID Connect (OIDC) ist es jedoch Standard, dass Benutzer ihre Abmeldung explizit bestätigen müssen, wenn sie von einer Anwendung ausgeloggt werden. Dieser Ansatz dient der Sicherheit, da so sichergestellt wird, dass die Abmeldung durch den Benutzer und nicht durch ein unbefugtes Skript erfolgt.
Trotzdem gibt es zahlreiche Szenarien, in denen ein automatischer Logout ohne Benutzerinteraktion sinnvoll ist:
- Automatisierte Abmeldung nach einem Timeout oder durch Administratoren.
- Single Logout (SLO), bei dem Benutzer von mehreren Anwendungen gleichzeitig abgemeldet werden.
- Optimierung von Benutzererfahrungen, indem unnötige Klicks eliminiert werden.
In diesem Artikel zeige ich, wie ein Keycloak-Logout ohne User-Bestätigung umgesetzt werden kann und warum der Parameter id_token_hint
dabei eine zentrale Rolle spielt.
Warum ist der Logout-Standard auf Benutzerbestätigung ausgelegt?
OpenID Connect (OIDC) ist ein Authentifizierungsprotokoll, das stark auf Sicherheit ausgelegt ist. Der Logout-Standard fordert, dass Benutzer ihre Abmeldung bestätigen müssen, um:
- Missbrauch zu verhindern: Ein böswilliger Akteur könnte sonst den Benutzer ohne dessen Wissen ausloggen.
- Sicherheit zu erhöhen: Explizite Abmeldungen minimieren Risiken, die durch automatisierte Skripte entstehen.
Dieser Ansatz ist sinnvoll, birgt jedoch Herausforderungen für Szenarien, in denen ein vollautomatischer Logout ohne Benutzerbestätigung erforderlich ist.
Der Schlüssel: id_token_hint
Der Parameter id_token_hint
ist eine wichtige Komponente des OIDC-Logouts. Er enthält den ID-Token des Benutzers, der beim Login von Keycloak oder einem anderen OIDC-Provider ausgegeben wurde.
Was ist der ID-Token?
Ein ID-Token ist ein JSON Web Token (JWT), das Informationen über den Benutzer enthält, wie z. B.:
sub
: Die eindeutige Benutzer-ID.iss
: Der Aussteller des Tokens (z. B. die Keycloak-Instanz).exp
: Das Ablaufdatum des Tokens.
Warum ist der id_token_hint
wichtig?
Beim Logout ohne Benutzerbestätigung wird der id_token_hint
verwendet, um:
- Die Benutzer-Session zu identifizieren: Der Token hilft Keycloak, die richtige Session des Benutzers zu invalidieren.
- Sicherheitsanforderungen zu erfüllen: Der
id_token_hint
beweist, dass die Abmeldeanforderung von einer vertrauenswürdigen Quelle stammt.
Keycloak-Logout ohne Benutzerbestätigung
Ein Logout ohne Bestätigung erfordert, dass alle relevanten Informationen an Keycloak übergeben werden. Neben dem id_token_hint
sind folgende Parameter entscheidend:
sid
: Die Session-ID, um die Benutzer-Session eindeutig zuzuordnen.client_id
: Die ID der Anwendung, die den Logout initiiert.post_logout_redirect_uri
: Die Ziel-URL, zu der der Benutzer nach dem Logout weitergeleitet wird.
Codebeispiel: Implementierung in Spring Boot
https://github.com/gzeuner/zeus-keycloak-demo
Warum id_token_hint
?
Der id_token_hint
spielt eine zentrale Rolle bei der automatisierten Abmeldung in OpenID Connect (OIDC). Ohne diesen Parameter muss der Benutzer die Abmeldung explizit bestätigen, da der Identity Provider (IDP), wie z. B. Keycloak, die Benutzer-Session nicht automatisch zuordnen kann. Der id_token_hint
enthält wichtige Informationen wie die Benutzer-ID (sub
) und die Session-ID (sid
), die es dem IDP ermöglichen, die korrekte Session sicher und präzise zu identifizieren und zu beenden.
Darüber hinaus trägt der id_token_hint
zur Sicherheit bei, da nur vertrauenswürdige Clients Zugriff auf den ID-Token haben und diesen Parameter verwenden können. Das ermöglicht nicht nur eine zuverlässige Authentifizierung der Logout-Anforderung, sondern auch eine nahtlose Abmeldung, ohne dass der Benutzer aktiv eingreifen muss.
Hinweis: Abhängig vom verwendeten Identity Provider (IDP) sind möglicherweise nicht alle im Beispiel gezeigten Parameter erforderlich. Einige Parameter, wie die sid
(Session-ID) oder die client_id
, könnten optional sein. Das Beispiel soll jedoch verdeutlichen, wie man mithilfe von Tools wie der TokenUtils-Klasse Zugriff auf die Inhalte eines Tokens erhält, um diese flexibel für unterschiedliche Anforderungen zu nutzen.