Runbook: Keycloak SSO broken¶
Symptômes possibles :
- Invalid parameter: redirect_uri affiché par Keycloak
- HTTP 431 Request Header Fields Too Large après login
- Account already exists. Please contact administrator. après SSO
- Boucle infinie de redirect entre service et Keycloak
Diagnostic flow¶
1. Quelle est l'erreur exacte vue par l'utilisateur ?¶
Ouvrir le devtools browser (F12) → onglet Network → refaire le login. Noter : - URL de la requête qui échoue - Status code - Response body
2. Lire les logs Keycloak¶
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
kubectl logs -n akko deploy/akko-akko-keycloak --tail=50 | grep -iE 'error|warn|invalid'
3. Pour OpenMetadata spécifiquement : vérifier la config DB¶
OpenMetadata stocke sa config auth en DB au 1er bootstrap (L05 lessons learned).
kubectl exec -n akko akko-postgresql-0 -- psql -U postgres -d openmetadata_db \
-c "SELECT json->>'authority', json->>'callbackUrl', json->'oidcConfiguration'->>'callbackUrl' FROM openmetadata_settings WHERE configtype='authenticationConfiguration';"
Les 3 valeurs doivent pointer vers le vrai domaine (pas akko.local).
Remediation par cas¶
Cas 1 : Invalid parameter: redirect_uri¶
Cause : Keycloak client n'a pas le redirect_uri dans sa whitelist.
Fix :
# Vérifier les redirect URIs dans le realm
kubectl get cm akko-akko-keycloak-realm -n akko -o jsonpath='{.data}' \
| python3 -c 'import sys,json; d=json.load(sys.stdin); realm=json.loads(list(d.values())[0]); [print(c["clientId"], c.get("redirectUris")) for c in realm["clients"]]'
Si missing : 1. Régénérer avec le bon domaine :
2. Commit + push → CI redeployPérenne : le hook akko-init-om-oidc reconcile la DB OM à chaque deploy
(Sprint 15). Si la régression persiste, vérifier que le hook tourne :
Cas 2 : HTTP 431 Request Header Fields Too Large¶
Cause : JWT Keycloak + cookies OAuth dépassent le buffer Jetty (L07).
Fix pérenne (déjà en place depuis Sprint 15) :
# helm/examples/values-dev.yaml
openmetadata:
extraEnvs:
- { name: SERVER_MAX_REQUEST_HEADER_SIZE, value: "64KiB" }
- { name: SERVER_MAX_RESPONSE_HEADER_SIZE, value: "64KiB" }
Si ça revient : l'user a vraiment beaucoup de rôles, bump à 128KiB.
Cas 3 : Account already exists¶
Cause : OM a un user seed avec email @akko.local, Keycloak publie
@<domain> → matching par username mais email diverge.
Fix pérenne : hook om-oidc sync les emails à chaque deploy (Sprint 15).
Force-fix one-shot :
kubectl exec -n akko akko-postgresql-0 -- psql -U postgres -d openmetadata_db \
-c "UPDATE user_entity SET json = jsonb_set(json, '{email}', to_jsonb(REPLACE(json->>'email', 'akko.local', '<domain>')::text)) WHERE json->>'email' LIKE '%@akko.local';"
kubectl rollout restart deploy/openmetadata -n akko
Cas 4 : Boucle infinie de redirect¶
Cause fréquente : enableAutoRedirect: true + config OIDC incorrecte.
Diagnostic :
Si la Location pointe vers Keycloak et Keycloak re-renvoie vers catalog
en boucle → vérifier oidcConfiguration.callbackUrl en DB.
Fix pérenne universel¶
Règle R02 : si tu fais un fix manuel, tu dois aussi :
1. Le reporter dans le code (values.yaml, init hook, etc.)
2. Commit + push
3. CI redeploy
4. Vérifier que le fix survit un kubectl delete pod (test idempotence)
Lessons learned¶
- L03 : Keycloak realm non réimporté au restart → toujours
--set-file - L05 : OM config figée en DB au 1er boot → hook reconcile
- L07 : Jetty 8KiB trop petit pour JWT → 64KiB