PyJWT (Python)JWT 库
错误信息
Invalid audience
也可能输出为
- jwt.exceptions.InvalidAudienceError: Invalid audience
对比“Audience doesn't match”:那条消息表示你传入了 `audience`,但没有任何相同的值。
PyJWT (Python) — jwt.exceptions.InvalidAudienceError
含义
令牌包含 `aud` 声明,但调用 `jwt.decode()` 时没有传入 `audience` 参数。PyJWT 不会忽略它无法检查的受众:令牌指明了接收方时,除非你说明自己是哪个接收方,否则令牌会被拒绝。如果 `aud` 的类型无效(既不是字符串,也不是字符串列表),也会出现同样的消息。
原因
验证方没有传入 audience
常见为不带 `aud` 的令牌编写的代码(或从最简示例中复制的代码),一旦身份提供商开始加入 `aud` 就会出错——而大多数身份提供商都会在访问令牌和 ID 令牌中加入它。传入预期的受众才是应有的修复方式。
传入的是 ID 令牌而不是访问令牌
偶见有些提供商签发的访问令牌不带 `aud`,但总会把客户端 ID 放进 ID 令牌的 `aud` 中(Amazon Cognito 就是常见的例子)。处理访问令牌时正常工作的代码,一旦客户端发来 ID 令牌就会开始失败。
aud 声明的类型无效
罕见如果颁发者把 `aud` 写成数字、对象或包含非字符串元素的列表,PyJWT 就无法把它签发的令牌与任何值匹配。
修复方法
- 1.
告诉 PyJWT 你是哪个受众
传入你的 API 的标识符(或可接受的标识符列表)。不要关闭 `verify_aud`——正是这项检查防止了为其他服务签发的令牌被接受。
python claims = jwt.decode( token, signing_key, algorithms=["ES256"], audience="https://api.example.com", # the identifier your API is registered with ) - 2.
不验证的解码只用于查看
`verify_signature: False` 会关闭所有检查,包括受众检查。它适合在调试时查看 `aud`,但绝不能用来授权请求。
python # Reading claims without trusting them (debugging, routing) - never for authorization. header = jwt.get_unverified_header(token) claims = jwt.decode(token, options={"verify_signature": False})