8.6 KiB
Plan: Passkey-UX, Keycloak-Theme & Redirect-Optimierung
Ziel
- Passkey-Registrierung optional und einfach zugänglich machen
- Keycloak Login-Seite pixel-perfekt wie Nextcloud aussehen lassen
- Health-Check-Redirect beschleunigen (Timeout 3s → 1s)
Umgebung (Bestand)
| Komponente | Details |
|---|---|
| Keycloak | v25.0, srvdocker02 (10.0.0.48:8180), Realm egonetix |
| Browser-Flow | browser-passkey (aktiv), inkl. WebAuthn Passwordless (ALTERNATIVE) |
| Nextcloud | v30.0.17, srvdocker02, oidc_auto_login App mit Health-Check |
| Docker-Compose Keycloak | /home/icke/keycloak/docker-compose.yml |
| Docker-Compose Nextcloud | /home/icke/nextcloud/docker-compose.yml |
| Nextcloud Repo | /home/rwiegand/Nextcloud/egonetix/nextcloud/ |
| Infrastructure Repo | /home/rwiegand/Nextcloud/egonetix/infrastructure/ |
Schritt 1: Health-Check Timeout reduzieren
Datei: /home/rwiegand/Nextcloud/egonetix/nextcloud/oidc_auto_login/lib/Controller/HealthController.php
Änderung:
// Zeile 55: timeout von 3 auf 1 reduzieren
$response = $client->get($discoveryUri, ['timeout' => 1]);
Dann auf srvdocker02 deployen:
scp oidc_auto_login/lib/Controller/HealthController.php root@10.0.0.48:/home/icke/nextcloud/oidc_auto_login/lib/Controller/
Auswirkung: Normal <200ms (Cache-Hit), Cache-Miss ~300ms, Keycloak-Down 1s statt 3s.
Schritt 2: Nextcloud Login-Seite analysieren
Bevor ich das Theme baue, muss ich die exakte Nextcloud Login-Seite erfassen:
https://nextcloud.egonetix.de/login?direct=1fetchen → HTML-Struktur, CSS-Klassen, Layout extrahieren- Nextcloud-CSS analysieren: Hintergrund, Farben, Fonts, Input-Styles, Button-Styles, Abstände
- Logo-URL und -Größe bestimmen
- Screenshot als Referenz nutzen (User liefert oder ich fetch die Seite)
Erwartete Nextcloud-Design-Tokens:
- Primärfarbe:
#0082C9 - Font: Inter / System-Fonts
- Hintergrund: Gradient oder Custom Background Image
- Login-Box: Zentrierte Card, abgerundete Ecken
- Inputs: Heller Rahmen, Padding, volle Breite
- Button: Blau (#0082C9), weiße Schrift, volle Breite
Schritt 3: Keycloak Custom Theme erstellen
Verzeichnisstruktur auf srvdocker02
/home/icke/keycloak/themes/nextcloud/
└── login/
├── theme.properties ← Parent-Theme + CSS-Imports
├── login.ftl ← Login-Formular (Nextcloud-Layout)
├── template.ftl ← Base-Template (HTML-Rahmen)
├── webauthn-authenticate.ftl ← Passkey-Login-Seite (Nextcloud-Look)
├── webauthn-register.ftl ← Passkey-Registrierung (Nextcloud-Look)
├── messages/
│ └── messages_de.properties ← Deutsche Texte
└── resources/
├── css/
│ └── nextcloud.css ← Pixel-perfekte Nextcloud-Styles
└── img/
└── logo.svg ← Nextcloud-Logo
theme.properties
parent=keycloak.v2
import=common/keycloak
styles=css/nextcloud.css
Erbt alle Templates von keycloak.v2, überschreibt nur CSS und die Templates die wir anpassen.
login.ftl (Kern-Template)
Pixel-perfekte Nachbildung der Nextcloud Login-Seite:
- Gleicher Hintergrund (Gradient/Bild)
- Zentrierte Login-Card
- Nextcloud-Logo oben
- Username + Password Inputs im Nextcloud-Stil
- Blauer Login-Button
- "Passkey einrichten" Link unten (→ Account Console)
- Social Provider (WebAuthn Passwordless) als "Mit Passkey anmelden" Button
webauthn-authenticate.ftl
Passkey-Login im Nextcloud-Stil:
- Gleicher Hintergrund und Card-Layout
- "Mit Passkey anmelden" Prompt
- "Andere Methode wählen" Link zurück zum Passwort-Formular
webauthn-register.ftl
Passkey-Registrierung im Nextcloud-Stil (für optionale Account-Console-Registrierung):
- Gleicher Look
- Klare Anweisungen auf Deutsch
nextcloud.css
Überschreibt die PatternFly-Styles von keycloak.v2:
--pf-global--primary-color:#0082C9- Background: Nextcloud-Gradient
- Card-Styling: Match Nextcloud login box
- Input-Styling: Match Nextcloud inputs
- Button-Styling: Match Nextcloud buttons
- Font: Inter / System-Fonts
- Alle Abstände und Radien angepasst
messages_de.properties
Deutsche Übersetzungen:
loginTitle=AnmeldenusernameOrEmail=Benutzername oder E-Mailpassword=PasswortdoLogIn=Anmeldenwebauthn-passwordless-login-title=Mit Passkey anmeldenwebauthn-passwordless-register-title=Passkey einrichten
Schritt 4: Docker-Compose anpassen (srvdocker02)
Datei: /home/icke/keycloak/docker-compose.yml
Volume-Mount hinzufügen:
services:
keycloak:
volumes:
- ./themes:/opt/keycloak/themes:ro
Theme-Verzeichnis erstellen und Theme-Dateien deployen:
mkdir -p /home/icke/keycloak/themes/nextcloud/login/resources/{css,img}
mkdir -p /home/icke/keycloak/themes/nextcloud/login/messages
Container neu starten: docker compose up -d
Schritt 5: Keycloak Realm konfigurieren
Login-Theme setzen
curl -X PUT ".../admin/realms/egonetix" \
-d '{"loginTheme": "nextcloud"}'
Account Console Theme (optional)
Falls Account Console auch angepasst werden soll (für Passkey-Registrierung):
curl -X PUT ".../admin/realms/egonetix" \
-d '{"accountTheme": "nextcloud"}'
Schritt 6: Optionale Passkey-Registrierung
Ansatz: Self-Service über Account Console + Hinweis auf Login-Seite
-
Login-Seite (login.ftl): Kleiner Hinweis-Link am Ende:
"Tipp: Passkey einrichten für schnelleren Login"
Dieser Link führt zu
https://auth.egonetix.de/realms/egonetix/account/#/security/signingin -
Account Console: User kann dort unter "Signing In" → "Set up Passwordless" einen Passkey registrieren
- Bitwarden Browser-Extension fängt den WebAuthn-Request ab → Passkey in Bitwarden
- "Dieses Gerät" / Platform Authenticator → Fingerabdrucksensor
-
Kein Zwang:
defaultActionbleibtfalse. Kein User wird gezwungen. -
Admin-Option für Zukunft: Falls einzelne User den Passkey einrichten SOLLEN:
curl -X PUT ".../admin/realms/egonetix/users/{userId}" \ -d '{"requiredActions": ["webauthn-register-passwordless"]}'
Schritt 7: Testen
| Test | Erwartung |
|---|---|
| Nextcloud öffnen → Auto-Redirect | Redirect in <200ms (Cache-Hit) |
| Keycloak Login-Seite | Sieht aus wie Nextcloud |
| Login mit Passwort | Funktioniert, Redirect zurück zu Nextcloud |
| "Mit Passkey anmelden" Button | Zeigt Browser-Passkey-Dialog |
| Passkey in Account Console registrieren | Bitwarden/Fingerprint funktioniert |
| Login mit Passkey | Direkt-Login ohne Passwort |
| Keycloak stoppen → LDAP-Fallback | Health-Check: 1s Timeout, dann normales Login |
?direct=1 |
Admin-Fallback funktioniert |
| Mobile Apps | Nicht betroffen |
Schritt 8: Dokumentation
Nextcloud Repo (/home/rwiegand/Nextcloud/egonetix/nextcloud/)
- README.md: Passkey-Dokumentation + Theme-Info ergänzen
Infrastructure Repo (/home/rwiegand/Nextcloud/egonetix/infrastructure/)
keycloak-sso.md: Passkey-Konfiguration + Theme-Dokumentationhosts/srvdocker02.md: Theme-Volume-Mount dokumentieren
Risiken
| Risiko | Mitigation |
|---|---|
| Theme-Fehler → Login-Seite kaputt | Theme erbt von keycloak.v2, Fallback auf Parent |
| WebAuthn nicht verfügbar (alter Browser) | Passwort-Login bleibt immer verfügbar |
| Keycloak-Restart nötig nach Theme-Änderung | Im Wartungsfenster oder akzeptabel (paar Sekunden) |
| CSS-Konflikte mit Keycloak Updates | Theme basiert auf CSS-Overrides, nicht auf Template-Hacks |
Dateien-Übersicht
| Datei | Aktion | Ort |
|---|---|---|
HealthController.php |
Timeout 3→1 | Nextcloud Repo + srvdocker02 |
themes/nextcloud/login/theme.properties |
Neu | srvdocker02 |
themes/nextcloud/login/login.ftl |
Neu | srvdocker02 |
themes/nextcloud/login/template.ftl |
Neu | srvdocker02 |
themes/nextcloud/login/webauthn-authenticate.ftl |
Neu | srvdocker02 |
themes/nextcloud/login/webauthn-register.ftl |
Neu | srvdocker02 |
themes/nextcloud/login/messages/messages_de.properties |
Neu | srvdocker02 |
themes/nextcloud/login/resources/css/nextcloud.css |
Neu | srvdocker02 |
themes/nextcloud/login/resources/img/logo.svg |
Neu | srvdocker02 |
docker-compose.yml (Keycloak) |
Volume-Mount | srvdocker02 |
| Keycloak Realm API | loginTheme setzen | API |
| README.md | Aktualisieren | Nextcloud Repo |
| keycloak-sso.md | Aktualisieren | Infrastructure Repo |
| hosts/srvdocker02.md | Aktualisieren | Infrastructure Repo |