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
O relógio do emissor está adiantado
comumTokens gerados em um host com o relógio alguns segundos adiantado falham em todo verificador com o relógio certo até que esses segundos passem. Parece intermitente porque a maioria das requisições chega com um atraso maior que o desvio.
O emissor definiu um nbf no futuro
ocasionalTokens que só passam a valer mais tarde (acesso agendado, ativação adiada) são rejeitados até o `nbf`. Esse é o comportamento previsto.
Timestamps em milissegundos
raraOs tempos de um JWT são em segundos. Um emissor que grava `time.time() * 1000` ou o `Date.now()` do JavaScript produz tokens que só serão válidos daqui a dezenas de milhares de anos.
Como corrigir
- 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.
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