Pular para o conteúdo
ecdsa.com
PyJWT (Python)Bibliotecas de JWT

Mensagem de erro

The token is not yet valid (iat)

Também aparece como

  • The token is not yet valid (nbf)
  • jwt.exceptions.ImmatureSignatureError: The token is not yet valid (iat)

A claim entre parênteses é `iat` ou `nbf`. As versões 2.0–2.5 do PyJWT aceitavam um `iat` no futuro; a 2.6.0 passou a rejeitá-lo, então uma atualização a partir de uma versão antiga pode revelar uma diferença de relógio que sempre existiu.

PyJWT (Python) — jwt.exceptions.ImmatureSignatureError

O que significa

É o `ImmatureSignatureError` do PyJWT: o `iat` (emitido em) ou o `nbf` (não válido antes de) do token é posterior à hora atual do verificador. O nome entre parênteses indica de qual claim se trata. O PyJWT rejeita tokens emitidos “no futuro” porque um emissor correto não consegue produzir um token assim; na prática, isso quase sempre significa que o relógio do emissor está adiantado em relação ao seu.

Por que acontece

Como corrigir

  1. 1.

    Permitir uma pequena tolerância

    O `leeway` (em segundos ou como `timedelta`) tolera diferenças de relógio em `exp`, `nbf` e `iat`. Mantenha-o na casa das dezenas de segundos e corrija com NTP o relógio que está desviando.

    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 o desvio

    Imprima cada claim de tempo em relação ao relógio local. Uma diferença positiva pequena no `iat` indica desvio de relógio; uma enorme indica um erro de unidade no emissor.

    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

Erros relacionados

Ver toda a base de erros de assinatura