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

错误信息

It is required that you pass in a value for the "algorithms" argument when calling decode().

PyJWT (Python) — jwt.exceptions.DecodeError

含义

从 PyJWT 2.0 开始,没有显式的 algorithms 列表,jwt.decode() 就拒绝运行。这并不是吹毛求疵:根据令牌自身的头部推断算法,会让算法混淆攻击成为可能(例如,把 RSA 公钥当作 HMAC 密钥来验证 HS256 令牌)。验证方——在服务端配置,攻击者无法触及——必须声明自己接受哪些算法,而 PyJWT 在 API 层面强制执行这一约定,让不安全的调用方式根本写不出来。

原因

修复方法

  1. 1.

    显式指定算法

    只传入颁发者实际使用的算法——对于 ECDSA 签名的令牌,通常是 ES256。如果一个服务要处理多种令牌,就为每个颁发者分别设置允许列表,而不是把它们合并成一个宽松的列表。

    python
    import jwt
    
    payload = jwt.decode(
        token,
        public_key_pem,
        algorithms=["ES256"],       # required — and a security control, not boilerplate
        audience="api://orders",
    )
  2. 2.

    只查看而不验证时,要显式声明

    如果只需要读取声明(调试、记录日志),就明确地关闭验证——并且切勿把结果用于授权决策。

    python
    claims = jwt.decode(token, options={"verify_signature": False})
    # or just the header:
    header = jwt.get_unverified_header(token)

相关错误

浏览完整的签名错误库