Message d’erreur
Not enough segments
Également affiché sous la forme
- jwt.exceptions.DecodeError: Not enough segments
PyJWT (Python) — jwt.exceptions.DecodeError
Ce que cela signifie
PyJWT n’a pas pu découper l’entrée en `header.payload.signature` : elle contient moins de deux points. La chaîne n’est pas un JWS compact, donc aucune clé ni aucun algorithme n’a été consulté. La valeur qui parvient à `jwt.decode()` est autre chose qu’un JWT, ou un JWT qui a perdu sa fin en chemin.
Pourquoi cela se produit
Un jeton d’accès opaque, pas un JWT
fréquenteDe nombreux fournisseurs OAuth émettent des jetons d’accès opaques (`ya29.…` chez Google, `gho_…` chez GitHub). Ils sont destinés à être validés par le fournisseur via l’introspection ou userinfo, pas à être décodés. Seul l’`id_token` d’OpenID Connect est assurément un JWT.
La mauvaise variable a été décodée
fréquenteUn ID de session, une clé d’API, `str(None)` ou la chaîne littérale « undefined » envoyée par un front-end. Journaliser `repr(token)[:40]` avant le décodage met généralement fin à la recherche.
Le jeton a été tronqué
occasionnelleUne colonne de base de données trop courte, une limite de longueur des lignes de journal ou une copie manuelle interrompue trop tôt peuvent supprimer le dernier segment et le point qui le précède.
Comment corriger l’erreur
- 1.
Vérifier la forme avant le décodage
Un JWS compact contient exactement deux points. Rejetez tout le reste avec une 401 dès la frontière de votre API, afin qu’aucune entrée malformée n’atteigne jamais le décodeur.
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.
Valider les jetons opaques auprès de l’émetteur
Si le fournisseur émet des jetons d’accès opaques, appelez son point de terminaison d’introspection de jeton (RFC 7662), ou configurez le fournisseur pour qu’il émette des jetons d’accès JWT pour votre API (souvent en demandant une audience).
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)