Keycloak einrichten
Keycloak ist als OIDC-Identity-Provider vollständig unterstützt. Diese Anleitung führt dich durch die Einrichtung — vom Anlegen des Realm-Clients bis zum Gruppen-Mapping in LIVCK.
Voraussetzung
Enterprise SSO ist für deine Organisation freigeschaltet und du hast die Berechtigung SSO verwalten. Lege zuerst eine SSO-Verbindung in LIVCK an (Einstellungen → Organisation → SSO → Neue Verbindung) und kopiere die dort angezeigte Redirect-URI — du brauchst sie im nächsten Schritt.
Übersicht
Keycloak kann Gruppenzugehörigkeiten auf zwei Wegen im Token liefern:
| Weg | Claim-Name | Inhalt | Empfohlen? |
|---|---|---|---|
| Realm-Rollen | realm_access.roles (verschachtelt) | Array von Rollen-Namen | Nur mit eigenem Mapper |
| Gruppen | groups | Array von Gruppen-Pfaden (z.B. /livck-admin) | Ja — für die meisten Fälle |
Wir empfehlen Gruppen, weil sie im Standard-Keycloak-Mapper direkt als flaches Array im Token landen und sich sauber mappen lassen. Realm-Rollen liegen verschachtelt in realm_access.roles und brauchen einen eigenen Protocol Mapper, damit LIVCK sie als Groups-Claim auslesen kann.
Weg A: Gruppen (empfohlen)
1. Realm (falls nötig) anlegen
Keycloak organisiert alles in Realms. Pro Organisation empfiehlt sich ein eigener Realm.
- Keycloak Admin Console → Menü oben links → Create Realm
- Realm name: z.B.
livck - → Create
Nicht im master-Realm
Lege für produktive Anwendungen immer einen eigenen Realm an. Der master-Realm ist für die Keycloak-Administration reserviert.
2. Client registrieren
- Realm livck → Clients → Create client
- Client type: OpenID Connect
- Client ID: z.B.
livck - → Next
- Authentication flow:
- Client authentication: ☑ ON (damit wird ein Client-Secret erzeugt — zwingend für LIVCK)
- Authorization: ☐ OFF
- Standard flow: ☑ ON
- Direct access grants: ☐ OFF (nicht empfohlen)
- → Next
- Valid redirect URIs: die Redirect-URI aus LIVCK eintragen
- Web origins: leer (nicht benötigt)
- → Save
3. Client-Secret kopieren
Clients → livck → Credentials → Client secret → Copy
Das Secret ist nur hier sichtbar — sicher ablegen.
4. Gruppen anlegen
Realm livck → Groups → Create group
Lege pro LIVCK-Rolle eine Gruppe an:
| Gruppenname | Pfad | LIVCK-Rolle |
|---|---|---|
livck-admin | /livck-admin | Admin |
livck-member | /livck-member | Member |
livck-viewer | /livck-viewer | Viewer |
Gruppen-Pfad wird normalisiert
LIVCK entfernt den führenden Schrägstrich automatisch und vergleicht case-insensitiv. Sowohl /livck-admin als auch livck-admin als auch LIVCK-Admin matchen die gleiche Gruppe. Trage im Mapping einfach den Wert ein, der dir im Keycloak-Admin angezeigt wird.
5. Benutzer den Gruppen zuweisen
Users → Benutzer auswählen → Groups tab → Join group → Gruppe wählen → Join
Wiederholen für jeden Benutzer / jede Rolle.
Häufigster Fehler
Ohne diese Zuweisung liefert Keycloak einen leeren groups-Claim. Das ist der Schritt, der am häufigsten vergessen wird — und der Grund, warum "keine Gruppen" im Test-Login auftaucht.
6. Groups-Claim im Token aktivieren
Keycloak liefert die Gruppen nicht automatisch im ID-Token. Du brauchst einen Protocol Mapper:
- Clients → livck → Client scopes tab
- Scope
openid(oder den dedizierten Client-Scope) → Mappers tab → Add mapper → By configuration - Vorlage: Group Membership
- Konfiguration:
| Feld | Wert |
|---|---|
| Name | z.B. groups |
| Token Claim name | groups |
| Full group path | ☑ ON (liefert /livck-admin statt nur livck-admin) |
| Add to ID token | ☑ ON ← Pflicht |
| Add to access token | ☐ OFF (nicht nötig) |
| Add to userinfo | ☑ ON (optional) |
- → Save
Im ID-Token ausliefern
Stelle sicher, dass "Add to ID token" aktiviert ist. LIVCK liest den Groups-Claim standardmäßig aus dem ID-Token.
7. Zugangsdaten sammeln
- Issuer-URL:
https://keycloak.example.com/realms/livck(ohne/.well-known/openid-configurationam Ende — LIVCK hängt das Discovery-Suffix automatisch an) - Client-ID: aus Schritt 2 (
livck) - Client-Secret: aus Schritt 3
Die Issuer-URL findest du auch unter Realm Settings → General → Issuer.
8. In LIVCK eintragen
Einstellungen → Organisation → SSO → Verbindung bearbeiten → Konfiguration:
| Feld | Wert |
|---|---|
| Issuer-URL | https://keycloak.example.com/realms/livck |
| Client-ID | aus Schritt 7 |
| Client-Secret | aus Schritt 7 |
| Groups-claim | groups |
| Quelle des Groups-claims | ID-Token |
| Wenn keine Gruppe passt | nach Bedarf (Standard-Rolle / Keine Rollen / Login ablehnen) |
→ Konfiguration speichern
9. Domain verifizieren
Siehe SSO einrichten → Domain verifizieren.
10. Mapping anlegen
Einstellungen → Organisation → SSO → Verbindung → Mappings:
Pro Gruppe einen Eintrag:
- IdP-Gruppe: der Pfad aus Schritt 4 (z.B.
/livck-admin— führender Schrägstrich und Groß-/Kleinschreibung werden von LIVCK ignoriert) - Rolle: die entsprechende LIVCK-Rolle
→ Hinzufügen
11. Testen
Klicke auf Login testen. Im Dry-Run-Report sollte stehen:
- Gruppen:
["livck-admin"] - Ermittelte Rollen: Admin
- Würde sich anmelden: ja
Weg B: Realm-Rollen (alternativ)
Verwende diesen Weg nur, wenn du bereits Keycloak-Rollen pflegst und keine Gruppen anlegen möchtest.
1. Client registrieren
Wie Weg A, Schritte 1–3.
2. Realm-Rollen anlegen
Realm Roles → Create role
| Rollenname | LIVCK-Rolle |
|---|---|
livck-admin | Admin |
livck-member | Member |
livck-viewer | Viewer |
3. Benutzer die Rollen zuweisen
Users → Benutzer → Role mapping tab → Assign role → Rolle wählen
4. Realm-Rollen als flachen Claim ausliefern
Keycloak liefert Realm-Rollen verschachtelt in realm_access.roles. Damit LIVCK sie als Groups-Claim auslesen kann, legst du einen Mapper an, der sie flach als eigenen Claim ausgibt:
- Clients → livck → Client scopes tab → openid → Mappers tab → Add mapper → By configuration
- Vorlage: User Realm Role
- Konfiguration:
| Feld | Wert |
|---|---|
| Name | z.B. realm-roles |
| Token claim name | groups ← LIVCK liest diesen Namen aus |
| Add to ID token | ☑ ON |
- → Save
Claim-Name = groups
Trage als Token-Claim-Name groups ein, nicht roles oder realm_access. LIVCK erwartet den unter Groups-claim konfigurierten Namen. Wenn du den Mapper realm-roles nennst, landet der Claim trotzdem unter dem konfigurierten Token-Claim-Namen.
5. In LIVCK eintragen
| Feld | Wert |
|---|---|
| Groups-claim | groups (entspricht dem Token-Claim-Namen aus Schritt 4) |
| Quelle des Groups-claims | ID-Token |
6. Mapping anlegen
- IdP-Gruppe: exakt der Rollenname (z.B.
livck-admin) - Rolle: die LIVCK-Rolle
7. Nachteil: verschachtelte Default-Rollen
Ohne den eigenen Mapper (Weg B Schritt 4) bleiben die Rollen in realm_access.roles verschachtelt. LIVCK kann diese Struktur nicht auslesen — der groups-Claim bleibt leer und der Login schlägt fehl.
Lösung: Verwende Weg A (Gruppen) oder den Mapper aus Schritt 4.
Troubleshooting
Im Test-Login steht "kein groups-Claim empfangen"
| Ursache | Lösung |
|---|---|
| Benutzer ist keiner Gruppe zugewiesen | Users → Benutzer → Groups → Gruppe zuweisen |
| Group-Mapper fehlt oder ist falsch konfiguriert | Clients → livck → Mappers → Group Membership prüfen |
| "Add to ID token" ist deaktiviert | Mapper → Checkbox setzen → Save |
Groups-Claim-Feld steht auf realm_access.roles | auf groups umstellen (oder Mapper aus Weg B anlegen) |
| Quelle steht auf UserInfo-Endpoint | auf ID-Token umstellen |
Im Test-Login stehen Pfade statt reinen Namen
Du hast "Full group path" im Mapper aktiviert. Das ist in Ordnung — LIVCK entfernt den führenden Schrägstrich automatisch, daher matchen /livck-admin und livck-admin gleichermaßen.
Im Test-Login steht die richtige Gruppe, aber Login schlägt fehl
Prüfe:
- Ist die E-Mail-Domain verifiziert? (SSO → Domains)
- Ist die Verbindung aktiviert?
- Hat der Benutzer eine verifizierte E-Mail im Keycloak?
- Stimmt die Redirect-URI exakt? (inkl. HTTPS-Schema, kein Trailing-Slash)
Issuer-URL validieren
Die Issuer-URL muss exakt sein — ohne Trailing-Slash und ohne /.well-known/openid-configuration am Ende. LIVCK hängt das Discovery-Suffix automatisch an.
Richtig:
https://keycloak.example.com/realms/livck
Falsch:
https://keycloak.example.com/realms/livck/.well-known/openid-configuration
https://keycloak.example.com/realms/livck/
https://keycloak.example.com/auth/realms/livck ← alter Pfad (nur Keycloak < 17)
Keycloak 17+ Pfad
Ab Keycloak 17 (Quarkus) entfällt das /auth/-Segment im Pfad. Bei älteren WildFly-Distributionen heißt die Issuer-URL https://keycloak.example.com/auth/realms/{realm}. Prüfe die URL unter Realm Settings → General → Issuer.
"Invalid issuer" oder Discovery schlägt fehl
- Prüfe, dass die Realm-URL von außerhalb deines Netzwerks erreichbar ist.
- Keycloak muss mit gügltigem TLS-Zertifikat laufen — LIVCK validiert die Discovery-Dokumente.
- Falls du hinter einem Reverse-Proxy betreibst: stelle sicher, dass Keycloak den
proxy-headersModus kennt (KC_PROXY_HEADERS=truebei Quarkus).
Client-Authentication-Fehler (401)
- Client-Secret korrekt kopiert? (nicht der Client-ID)
- Client authentication ist im Client auf ON?
- Redirect-URI stimmt exakt überein?
Weiterführende Themen
- Enterprise SSO – Übersicht
- Rollen & Berechtigungen – Ziel der Gruppen-Zuordnung
- Mitglieder – Wer gehört zur Organisation
- Entra ID (Azure AD) einrichten – Alternative mit App-Rollen