Mensaje de error
Not enough segments
También se muestra como
- jwt.exceptions.DecodeError: Not enough segments
PyJWT (Python) — jwt.exceptions.DecodeError
Qué significa
PyJWT no pudo dividir la entrada en `header.payload.signature`: contiene menos de dos puntos. La cadena no es un JWS compacto, así que no se consultó ninguna clave ni ningún algoritmo. Lo que llega a `jwt.decode()` es algo distinto de un JWT, o un JWT que perdió el final por el camino.
Por qué ocurre
Un token de acceso opaco, no un JWT
frecuenteMuchos proveedores de OAuth emiten tokens de acceso opacos (`ya29.…` de Google, `gho_…` de GitHub). Están pensados para que los valide el proveedor mediante introspección o userinfo, no para decodificarlos. Solo está garantizado que el `id_token` de OpenID Connect sea un JWT.
Se decodificó la variable equivocada
frecuenteUn ID de sesión, una clave de API, `str(None)` o el literal «undefined» que llega de un frontend. Registrar `repr(token)[:40]` antes de decodificar suele poner fin a la búsqueda.
El token se cortó
ocasionalUna columna de base de datos demasiado corta, un límite de longitud de las líneas de registro o una copia manual que se detuvo antes de tiempo pueden eliminar el último segmento y el punto que lo precede.
Cómo solucionarlo
- 1.
Comprobar la forma antes de decodificar
Un JWS compacto tiene exactamente dos puntos. Rechaza todo lo demás con un 401 en el perímetro de tu API, para que una entrada mal formada nunca llegue al decodificador.
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.
Validar los tokens opacos con el emisor
Si el proveedor emite tokens de acceso opacos, llama a su endpoint de introspección de tokens (RFC 7662) o configura el proveedor para que emita tokens de acceso JWT para tu API (a menudo, basta con solicitar una audiencia).
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)