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

エラーメッセージ

Signature has expired

PyJWT (Python) — jwt.exceptions.ExpiredSignatureError

このエラーの意味

トークンの exp クレームが検証者の現在時刻より前であるため、PyJWT は(概念上は)署名のチェックに成功した後でトークンを拒否しました。この表現は少し誤解を招きます。署名そのものが期限切れになるわけではなく、トークンの有効期間が終わったということです。

発生する理由

修正方法

  1. 1.

    わずかなずれを leeway で吸収する

    leeway パラメーター(秒)は、exp と nbf のチェックに適用されます。多くても数十秒にしてください。それより大きい値は、気づかないうちにトークンの有効期間を延ばしてしまいます。

    python
    import jwt
    
    payload = jwt.decode(
        token, key,
        algorithms=["ES256"],
        leeway=30,   # seconds of tolerated clock skew
    )
  2. 2.

    実際のタイムスタンプを確認する

    検証なしでクレームを読み、exp をホストの時計と比較してください。差の大きさから、期限切れなのか、時刻のずれなのか、発行時のバグなのかがわかります。

    python
    import jwt, time
    claims = jwt.decode(token, options={"verify_signature": False})
    print("exp:", claims["exp"], "now:", int(time.time()),
          "delta:", int(time.time()) - claims["exp"], "s")

関連するエラー

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