Fehlermeldung
Not enough segments
Auch ausgegeben als
- jwt.exceptions.DecodeError: Not enough segments
PyJWT (Python) — jwt.exceptions.DecodeError
Was der Fehler bedeutet
PyJWT konnte die Eingabe nicht in `header.payload.signature` zerlegen, weil sie weniger als zwei Punkte enthält. Der String ist kein kompaktes JWS, deshalb wurden weder Schlüssel noch Algorithmus herangezogen. Der Wert, der bei `jwt.decode()` ankommt, ist etwas anderes als ein JWT – oder ein JWT, das unterwegs sein Ende verloren hat.
Warum der Fehler auftritt
Ein opakes Access Token, kein JWT
häufigViele OAuth-Provider stellen opake Access Tokens aus (`ya29.…` bei Google, `gho_…` bei GitHub). Diese Tokens sind dafür gedacht, über den Provider per Introspection oder Userinfo geprüft zu werden, nicht dekodiert. Nur das `id_token` von OpenID Connect ist garantiert ein JWT.
Die falsche Variable wurde dekodiert
häufigEine Session-ID, ein API-Schlüssel, `str(None)` oder der wörtliche String „undefined“ aus einem Frontend. Loggst du vor dem Dekodieren `repr(token)[:40]`, ist die Suche meist beendet.
Das Token wurde abgeschnitten
gelegentlichEine zu kurze Datenbankspalte, eine Längenbegrenzung für Logzeilen oder eine manuelle Kopie, die zu früh endet, können das letzte Segment und den Punkt davor entfernen.
So behebst du den Fehler
- 1.
Form vor dem Dekodieren prüfen
Ein kompaktes JWS hat genau zwei Punkte. Lehne alles andere schon am Eingang deiner API mit 401 ab, damit fehlerhafte Eingaben den Decoder nie erreichen.
python def bearer_token(headers: dict) -> str | None: scheme, _, token = headers.get("Authorization", "").partition(" ") if scheme.lower() != "bearer" or token.count(".") != 2: return None # not a compact JWS: answer 401 instead of decoding return token - 2.
Opake Tokens beim Aussteller prüfen
Stellt der Provider opake Access Tokens aus, rufe seinen Endpunkt für Token Introspection (RFC 7662) auf oder konfiguriere den Provider so, dass er für deine API JWT-Access-Tokens ausstellt (oft, indem du eine Audience anforderst).
python import requests # Opaque tokens are validated by the authorization server (RFC 7662), not by decoding them. resp = requests.post( "https://issuer.example.com/oauth2/introspect", data={"token": token}, auth=(CLIENT_ID, CLIENT_SECRET), timeout=5, ) active = resp.json().get("active", False)