エラーメッセージ
The token is not yet valid (iat)
別の表記
- The token is not yet valid (nbf)
- jwt.exceptions.ImmatureSignatureError: The token is not yet valid (iat)
括弧内のクレームは `iat` または `nbf` です。PyJWT 2.0〜2.5 は未来の `iat` を受け入れていましたが、2.6.0 から拒否するようになりました。そのため、古いバージョンからアップグレードすると、以前から存在していた時刻のずれが表面化することがあります。
PyJWT (Python) — jwt.exceptions.ImmatureSignatureError
このエラーの意味
PyJWT の `ImmatureSignatureError` です。トークンの `iat`(発行日時)または `nbf`(有効期間の開始日時)が、検証者の現在時刻より後になっています。括弧内の名前で、どちらのクレームかがわかります。正しい発行者が「未来に」発行されたトークンを作ることはありえないので、PyJWT はそのようなトークンを拒否します。実際には、ほぼ必ず、発行者の時計が検証側の時計より進んでいることを意味します。
発生する理由
発行者の時計が進んでいる
よくある時計が数秒進んでいるホストで生成されたトークンは、その秒数が経過するまで、正しい時計を持つすべての検証者で失敗します。ほとんどのリクエストは、ずれの秒数が経過した後に届くので、断続的な問題に見えます。
発行者が未来の nbf を設定した
ときどき後から有効になるトークン(予定されたアクセス、遅延アクティベーション)は、`nbf` の時刻まで拒否されます。これは意図された動作です。
ミリ秒単位のタイムスタンプ
まれJWT の時刻は秒単位です。`time.time() * 1000` や JavaScript の `Date.now()` を書き込む発行者は、数万年後にならないと有効にならないトークンを生成します。
修正方法
- 1.
わずかな許容誤差を設ける
`leeway`(秒数または `timedelta`)は、`exp`、`nbf`、`iat` について時計のずれを許容します。数十秒以内にとどめ、ずれている時計は NTP で修正してください。
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.
ずれを測定する
各時刻クレームを、ローカルの時計からの相対値で出力してください。`iat` が小さな正の値ならずれ、非常に大きな値なら発行者の単位のバグです。
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