So sieht die Meldung aus
{"error":"invalid_grant","error_description":"Code not valid"}Häufige Ursachen
- Authorization Code abgelaufen (oft nach 30–60 Sekunden) oder bereits einmal eingelöst, z. B. durch Doppelklick oder Browser-Reload.
- redirect_uri im Token-Request weicht von der im Authorize-Request ab.
- Refresh Token abgelaufen, widerrufen oder die IdP-Session beendet (Keycloak: „Session not active“).
- PKCE: code_verifier passt nicht zum code_challenge.
- Uhrzeit von Client und IdP weicht deutlich ab.
Prüfen
- Zeitsynchronisation prüfen
timedatectl | grep -E 'synchronized|Local time' - Fehler im Log von Client oder IdP suchen
journalctl --since '15 min ago' | grep -iE 'invalid_grant|token endpoint|oidc' - Issuer und Token-Endpoint des IdP anzeigen
curl -s https://sso.example.com/realms/main/.well-known/openid-configuration | jq -r '.issuer, .token_endpoint'
Lösung
- Login einmal sauber neu starten, ohne Zurück-Taste oder Reload auf der Callback-URL.
- redirect_uri in App und IdP exakt gleich halten, inklusive Protokoll und Schrägstrich am Ende.
- Uhrzeit per NTP synchronisieren:
timedatectl set-ntp true. - Bei Refresh-Fehlern die Session-Laufzeiten am IdP mit der Token-Laufzeit der App abgleichen.
- Mehrere App-Instanzen hinter einem Load Balancer: gemeinsamen Session-Speicher nutzen, damit der PKCE-Verifier auf jeder Instanz verfügbar ist.
Häufige Fragen
Was bedeutet „Code not valid“ bei Keycloak?
Der Code wurde schon eingelöst, ist abgelaufen oder gehört zu einer anderen Session. Häufig ist ein zweiter Callback-Aufruf durch Reload oder Prefetch die Ursache.
Muss der Benutzer etwas tun?
Meist genügt ein neuer Login. Tritt der Fehler regelmäßig auf, liegt es an der Konfiguration von App, Proxy oder IdP.