jsonwebtoken (Node.js)JWT ライブラリ
エラーメッセージ
jwt not active
jsonwebtoken (Node.js) — NotBeforeError from jwt.verify()
このエラーの意味
jsonwebtoken の `NotBeforeError` です。トークンの `nbf`(not before)クレームが検証者の現在時刻より後であるため、トークンはまだ有効ではありません。エラーの `date` プロパティには、トークンが有効になる時刻が入っています。署名はすでに検証済みで、問題はありません。
発生する理由
検証者の時計が発行者の時計より遅れている
よくある発行者は一般に、`nbf` を発行時刻に設定します。検証するマシンの時計が数秒から数分遅れていると、発行されたばかりのトークンは、時計が追いつくまで失敗します。これは、ログイン直後に断続的に発生する障害のように見えます。
notBefore の遅延を指定してトークンに署名している
ときどき`jwt.sign(payload, key, { notBefore: "5m" })` は、後から有効になるトークンを意図的に発行します。それより前に使えば、拒否されるのが正しい動作です。
ミリ秒単位の nbf
まれNumericDate はエポックからの秒数です。`nbf: Date.now()` を含む手作りのペイロードは、はるか未来になるまで有効になりません。
修正方法
- 1.
わずかな時刻のずれを許容する
`clockTolerance`(秒単位)は、`nbf` と `exp` の両方に適用されます。値は 1 分以下に抑え、実際の時計のずれは両方のマシンで NTP を使って修正してください。
js jwt.verify(token, publicKey, { algorithms: ["ES256"], clockTolerance: 30, // seconds; applies to nbf and exp }); - 2.
トークンがどれだけ早く使われたかを測る
`err.date` を検証者の時計と比較してください。差が数秒なら時刻のずれ、`notBefore` の遅延とちょうど同じならトークンの使用が早すぎること、数千年ならミリ秒のバグを意味します。
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; }