Saltar al contenido
ecdsa.com
PyJWT (Python)Bibliotecas de JWT

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

Cómo solucionarlo

  1. 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. 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

Errores relacionados

Explorar toda la base de datos de errores de firma