199 lines
7.0 KiB
Markdown
199 lines
7.0 KiB
Markdown
# Plan: Fix Flaw 1 (Service Unavailable) + Flaw 2 (Theme Layout)
|
|
|
|
## Flaw 1: "Service Unavailable" nach OIDC-Login
|
|
|
|
### Diagnose
|
|
|
|
**Symptom:** Nach erfolgreichem Keycloak-Login zeigt grommunio-web "Unknown error - Service Unavailable".
|
|
|
|
**Log-Evidenz:**
|
|
```
|
|
zcore[25984]: rhost=[] user= zs_logon_token rejected: Token did not validate
|
|
```
|
|
|
|
**Wichtig:** `user=` ist LEER -- zcore kann keinen User aus dem Token extrahieren.
|
|
|
|
**Was funktioniert:**
|
|
- PHP OIDC-Flow: `login() returned 0 (NOERROR)` -- Keycloak-Auth OK
|
|
- bearer_pubkey: Korrekt, gleicher Key wie Keycloak, lesbar für gromox-User
|
|
- keycloak.json: Korrekt konfiguriert mit `realm-public-key` und `principal-attribute`
|
|
- Alle Services: nginx, php-fpm, gromox-http, gromox-zcore laufen
|
|
|
|
**Vermutete Ursache:** Die PHP-Schicht (grommunio-web) authentifiziert sich erfolgreich bei Keycloak, aber wenn sie den Bearer-Token an gromox-zcore weiterreicht (`mapi_logon_token()`), schlaegt die Token-Validierung in zcore fehl. Der leere `user=` deutet darauf hin, dass zcore den Token nicht parsen oder die Claims nicht extrahieren kann.
|
|
|
|
### Schritt 1: gromox-zcore Neustart + Live-Test
|
|
|
|
```bash
|
|
ssh root@10.0.0.23 'systemctl restart gromox-zcore && sleep 2 && systemctl status gromox-zcore --no-pager'
|
|
```
|
|
|
|
Dann im Browser einloggen und sofort Logs pruefen:
|
|
```bash
|
|
ssh root@10.0.0.23 'journalctl -u gromox-zcore --since "1 min ago" --no-pager'
|
|
```
|
|
|
|
### Schritt 2: JWT-Token aus Keycloak dekodieren
|
|
|
|
Ein Token von Keycloak holen und die Claims pruefen:
|
|
```bash
|
|
# Token holen (Resource Owner Password Grant fuer Test)
|
|
TOKEN=$(curl -s -X POST "https://auth.egonetix.de/realms/egonetix/protocol/openid-connect/token" \
|
|
-d "grant_type=password" \
|
|
-d "client_id=grommunio" \
|
|
-d "username=robert.wiegand@egonetix.de" \
|
|
-d "password=<pw>" | jq -r '.access_token')
|
|
|
|
# Token dekodieren (ohne Signatur-Check)
|
|
echo "$TOKEN" | cut -d. -f2 | base64 -d 2>/dev/null | jq .
|
|
```
|
|
|
|
Pruefen ob folgende Claims vorhanden:
|
|
- `iss` = `https://auth.egonetix.de/realms/egonetix`
|
|
- `aud` = enthaelt `grommunio` oder `account`
|
|
- `preferred_username` = `robert.wiegand@egonetix.de`
|
|
- `sub` = UUID des Users
|
|
- `azp` = `grommunio`
|
|
|
|
### Schritt 3: gromox-zcore Debug-Logging erhoehen
|
|
|
|
```bash
|
|
ssh root@10.0.0.23 'sed -i "s/log_level=6/log_level=1/" /etc/gromox/zcore.cfg && systemctl restart gromox-zcore'
|
|
```
|
|
|
|
Log-Level 1 = maximales Logging. Nach Test zuruecksetzen auf 6.
|
|
|
|
### Schritt 4: PHP MAPI Token-Uebergabe pruefen
|
|
|
|
Pruefen was genau grommunio-web an zcore uebergibt:
|
|
```bash
|
|
ssh root@10.0.0.23 'grep -n "logon_token\|mapi_logon\|bearer\|zs_logon" /usr/share/php-mapi/class.keycloak.php /usr/share/grommunio-web/server/includes/core/*.php 2>/dev/null'
|
|
```
|
|
|
|
### Schritt 5: Direct Access Grants pruefen
|
|
|
|
Falls `grant_type=password` nicht erlaubt ist (Public Client), per Browser-DevTools:
|
|
1. https://mail.egonetix.de oeffnen
|
|
2. DevTools Network-Tab
|
|
3. Login durchfuehren
|
|
4. Token-Exchange-Request finden und access_token kopieren
|
|
5. Manuell dekodieren
|
|
|
|
### Schritt 6: Fix anwenden
|
|
|
|
Basierend auf Diagnose -- moegliche Fixes:
|
|
|
|
**A) Token-Claim-Problem:** Keycloak Mapper anpassen (preferred_username muss E-Mail enthalten)
|
|
**B) Audience-Problem:** Keycloak Client Scope anpassen
|
|
**C) gromox-Config:** Fehlende Config-Option in zcore.cfg/http.cfg
|
|
**D) PHP-Code:** grommunio-web uebergibt falsches Token-Format an zcore
|
|
|
|
---
|
|
|
|
## Flaw 2: Keycloak Theme Layout kaputt
|
|
|
|
### Diagnose
|
|
|
|
**Screenshot-Analyse (Auswahl_2145.jpg):**
|
|
- Berg-Hintergrund: OK
|
|
- Login-Card (weiss/glassmorphism): Rechts positioniert, OK
|
|
- **Logo "egonetix" + "IT SOLUTIONS":** LINKS neben der Card, halb verdeckt
|
|
- **"Log in" Titel:** LINKS unter dem Logo, ausserhalb der Card
|
|
- Nur Formularfelder (Username, Button, Passkey-Hint) sind IN der Card
|
|
|
|
**Root Cause:** Keycloak v2 template.ftl rendert den DOM so:
|
|
|
|
```html
|
|
<div class="pf-v5-c-login__main">
|
|
<div class="pf-v5-c-login__main-header"> <-- Header-Section (Logo + Titel)
|
|
<h1 id="kc-page-title">...</h1>
|
|
</div>
|
|
<div class="pf-v5-c-login__main-body"> <-- Body-Section (Formular)
|
|
...
|
|
</div>
|
|
</div>
|
|
```
|
|
|
|
**Das CSS** applied Card-Styling NUR auf `.pf-v5-c-login__main-body`, NICHT auf den Parent `.pf-v5-c-login__main`. Deshalb sind Logo und Titel AUSSERHALB der visuellen Card.
|
|
|
|
### Theme-Dateien (auf srvdocker02)
|
|
|
|
| Datei | Pfad |
|
|
|-------|------|
|
|
| CSS | `/home/icke/keycloak/themes/egonetix/login/resources/css/egonetix.css` |
|
|
| login.ftl | `/home/icke/keycloak/themes/egonetix/login/login.ftl` |
|
|
| login-username.ftl | `/home/icke/keycloak/themes/egonetix/login/login-username.ftl` |
|
|
| logout-confirm.ftl | `/home/icke/keycloak/themes/egonetix/login/logout-confirm.ftl` |
|
|
| theme.properties | `/home/icke/keycloak/themes/egonetix/login/theme.properties` |
|
|
|
|
### Fix: CSS umstrukturieren
|
|
|
|
**Kern-Aenderung:** Card-Styling von `.pf-v5-c-login__main-body` auf `.pf-v5-c-login__main` verschieben.
|
|
|
|
```css
|
|
/* Card auf den PARENT anwenden (umschliesst Header + Body) */
|
|
.pf-v5-c-login__main {
|
|
background: var(--ego-card-background) !important;
|
|
backdrop-filter: var(--ego-card-backdrop) !important;
|
|
-webkit-backdrop-filter: var(--ego-card-backdrop) !important;
|
|
border-radius: var(--ego-border-radius) !important;
|
|
box-shadow: var(--ego-card-shadow) !important;
|
|
border: 1px solid rgba(255, 255, 255, 0.3) !important;
|
|
padding: var(--ego-card-padding) !important;
|
|
width: var(--ego-card-width) !important;
|
|
max-width: 90vw !important;
|
|
margin: 0 auto !important;
|
|
}
|
|
|
|
/* Kinder transparent machen (kein doppelter Card-Effekt) */
|
|
.pf-v5-c-login__main-header,
|
|
.pf-v5-c-login__main-body,
|
|
#kc-form,
|
|
#kc-content-wrapper,
|
|
#kc-form-wrapper {
|
|
background: transparent !important;
|
|
box-shadow: none !important;
|
|
border: none !important;
|
|
padding: 0 !important;
|
|
width: 100% !important;
|
|
border-radius: 0 !important;
|
|
backdrop-filter: none !important;
|
|
-webkit-backdrop-filter: none !important;
|
|
}
|
|
```
|
|
|
|
**Zusaetzlich:** `.pf-v5-c-login__main` Layout korrigieren:
|
|
```css
|
|
.pf-v5-c-login__main {
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
}
|
|
```
|
|
|
|
### Schritt-fuer-Schritt
|
|
|
|
1. **egonetix.css** auf srvdocker02 editieren:
|
|
- Card-Styling von `#kc-form, .pf-v5-c-login__main-body, #kc-content-wrapper, #kc-form-wrapper` entfernen
|
|
- Card-Styling auf `.pf-v5-c-login__main` setzen
|
|
- Alle Kinder (header, body, form-wrapper) transparent machen
|
|
- Layout-Anpassung: `.pf-v5-c-login__main` als flex-column
|
|
|
|
2. **Keycloak-Cache leeren** (Theme-Aenderungen erfordern Cache-Clear oder Restart):
|
|
```bash
|
|
ssh root@10.0.0.48 'docker restart keycloak'
|
|
```
|
|
|
|
3. **Browser-Test:** https://auth.egonetix.de/realms/egonetix/account -> Logo + Titel + Formular alle IN der Card
|
|
|
|
---
|
|
|
|
## Reihenfolge
|
|
|
|
1. **Flaw 2 zuerst** (Theme-Fix) -- CSS-Aenderung auf srvdocker02, schnell verifizierbar
|
|
2. **Flaw 1 danach** (Service Unavailable) -- erfordert iteratives Debugging auf srvmail01
|
|
|
|
## Verifikation
|
|
|
|
- **Flaw 2:** Browser -> https://mail.egonetix.de -> Keycloak-Login-Seite zeigt Logo + Titel INNERHALB der Card
|
|
- **Flaw 1:** Browser -> Login -> kein "Service Unavailable" Dialog, Mailbox oeffnet sich
|