Mensaje de error
The token is not yet valid (iat)
También se muestra como
- The token is not yet valid (nbf)
- jwt.exceptions.ImmatureSignatureError: The token is not yet valid (iat)
El claim entre paréntesis es `iat` o `nbf`. Las versiones 2.0 a 2.5 de PyJWT aceptaban un `iat` en el futuro; la 2.6.0 empezó a rechazarlo, así que actualizar desde una versión antigua puede sacar a la luz un desfase de reloj que siempre había existido.
PyJWT (Python) — jwt.exceptions.ImmatureSignatureError
Qué significa
`ImmatureSignatureError` de PyJWT: el `iat` (fecha de emisión) o el `nbf` (no antes de) del token es posterior a la hora actual del verificador. El nombre entre paréntesis indica de qué claim se trata. PyJWT rechaza los tokens emitidos «en el futuro» porque un emisor correcto no puede producirlos; en la práctica, esto casi siempre significa que el reloj del emisor va adelantado respecto al tuyo.
Por qué ocurre
El reloj del emisor va adelantado
frecuenteLos tokens generados en un host cuyo reloj va unos segundos adelantado fallan en todos los verificadores que tienen la hora correcta hasta que pasan esos segundos. Parece intermitente porque la mayoría de las solicitudes llegan cuando ese desfase ya ha pasado.
El emisor fijó un nbf futuro
ocasionalLos tokens que pasan a ser válidos más adelante (acceso programado, activación diferida) se rechazan hasta que llega `nbf`. Es el comportamiento previsto.
Marcas de tiempo en milisegundos
raraLos tiempos de JWT se expresan en segundos. Un emisor que escribe `time.time() * 1000` o `Date.now()` de JavaScript produce tokens que solo serán válidos dentro de decenas de miles de años.
Cómo solucionarlo
- 1.
Permitir un pequeño margen de tolerancia
`leeway` (en segundos o como `timedelta`) tolera diferencias de reloj en `exp`, `nbf` e `iat`. Mantenlo en unas decenas de segundos y corrige con NTP el reloj que se desvía.
python from datetime import timedelta claims = jwt.decode( token, signing_key, algorithms=["ES256"], audience="https://api.example.com", leeway=timedelta(seconds=30), # applies to exp, nbf and iat ) - 2.
Medir el desfase
Imprime cada claim de tiempo en relación con el reloj local. Una diferencia positiva pequeña en `iat` indica desfase; una enorme, un error de unidades en el emisor.
python import time c = jwt.decode(token, options={"verify_signature": False}) now = int(time.time()) print({k: c[k] - now for k in ("iat", "nbf", "exp") if k in c}) # seconds relative to this host