Aller au contenu

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 :

bash helm/scripts/generate-domain-values.sh <domain>
2. Commit + push → CI redeploy

Pé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 :

kubectl logs -n akko -l component=om-oidc --tail=30

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 :

curl -sv https://catalog.<domain>/signin 2>&1 | grep -E 'Location|HTTP'

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