本文へスキップ
ecdsa.com
PyJWT (Python)JWT ライブラリ

エラーメッセージ

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 はそのようなトークンを拒否します。実際には、ほぼ必ず、発行者の時計が検証側の時計より進んでいることを意味します。

発生する理由

修正方法

  1. 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. 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

関連するエラー

署名エラーデータベースをすべて見る