Mensaje de error
jwt not active
jsonwebtoken (Node.js) — NotBeforeError from jwt.verify()
Qué significa
`NotBeforeError` de jsonwebtoken: el token tiene un claim (declaración) `nbf` («no antes de») posterior a la hora actual del verificador, así que el token aún no es válido. La propiedad `date` del error contiene el momento en que el token pasa a ser válido. La firma ya se comprobó y es correcta.
Por qué ocurre
El reloj del verificador va retrasado respecto al del emisor
frecuenteLos emisores suelen fijar `nbf` en el momento de emisión. Si el reloj de la máquina que verifica va unos segundos o minutos retrasado, los tokens recién emitidos fallan hasta que los relojes se igualan, lo que parece un fallo intermitente justo después de iniciar sesión.
El token se firmó con un retraso de notBefore
ocasional`jwt.sign(payload, key, { notBefore: "5m" })` emite deliberadamente un token que pasa a ser válido más tarde. Si se usa antes, el rechazo es correcto.
nbf en milisegundos
raraNumericDate son segundos desde la época Unix. Una carga útil construida a mano con `nbf: Date.now()` solo es válida en un futuro lejano.
Cómo solucionarlo
- 1.
Permitir un pequeño desfase de reloj
`clockTolerance` (en segundos) se aplica tanto a `nbf` como a `exp`. Mantenla en un minuto o menos y corrige la deriva real con NTP en ambas máquinas.
js jwt.verify(token, publicKey, { algorithms: ["ES256"], clockTolerance: 30, // seconds; applies to nbf and exp }); - 2.
Medir con cuánta antelación llega el token
Compara `err.date` con el reloj del verificador. Unos segundos indican desfase; exactamente el retraso de `notBefore`, que el token se usa demasiado pronto; miles de años, un error de milisegundos.
js try { jwt.verify(token, publicKey, { algorithms: ["ES256"] }); } catch (err) { if (err.name === "NotBeforeError") { const early = (err.date.getTime() - Date.now()) / 1000; console.warn("token becomes valid in", early.toFixed(1), "s"); } throw err; }