跳到主要内容
ecdsa.com
PyJWT (Python)JWT 库

错误信息

Signature has expired

PyJWT (Python) — jwt.exceptions.ExpiredSignatureError

含义

令牌的 exp 声明早于验证方的当前时间,因此 PyJWT 在签名检查(从概念上说)通过之后拒绝了它。这条消息的措辞有些误导——签名本身不会过期,是令牌的有效期已经结束。

原因

修复方法

  1. 1.

    用容差吸收少量时钟偏差

    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")

相关错误

浏览完整的签名错误库