You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ClientSecretCredential获取Azure令牌后PyJwt解码失败问题

解决Azure访问令牌PyJWT验签失败问题

核心错误原因

你用**客户端密钥(client_secret)**验证RS256签名的做法完全错误。RS256是非对称加密算法:Azure AD用自己的RSA私钥给令牌签名,验签必须用对应的RSA公钥,而不是你的客户端密钥——client_secret是HS256这类对称算法才会用到的验证密钥,和RSA公钥格式完全不兼容,这就是你报错的根本原因。

正确解决步骤

要验证Azure AD签发的RS256签名令牌,你需要从Azure AD的公钥端点获取对应公钥,再用它验签。推荐用PyJWT的PyJWKClient自动处理公钥获取和匹配:

修改后的代码示例

import jwt
from jwt import PyJWKClient

# 替换成你的实际值
token = "你的Azure访问令牌"
tenant_id = "你的租户ID"
client_id = "你的应用客户端ID"

# Azure AD的公钥集合端点(v2.0版本,v1版本请调整路径)
jwks_url = f"https://login.microsoftonline.com/{tenant_id}/discovery/v2.0/keys"
jwks_client = PyJWKClient(jwks_url)

# 根据令牌中的kid字段自动匹配对应的公钥
signing_key = jwks_client.get_signing_key_from_jwt(token)

# 解码并完成完整验证(签名、issuer、audience)
decoded_token = jwt.decode(
    token,
    signing_key.key,
    algorithms=["RS256"],
    issuer=f"https://login.microsoftonline.com/{tenant_id}/v2.0",  # v1版本去掉v2.0
    audience=client_id
)

print(decoded_token)

注意事项

  • 如果你用的是Azure AD v1端点的令牌,issuer格式为https://login.microsoftonline.com/{tenant_id}/,公钥端点为https://login.microsoftonline.com/{tenant_id}/discovery/v1.0/keys
  • 永远不要将verify_signature设为false,这会跳过签名验证,导致令牌真实性无法保证,存在安全风险
  • 确保tenant_id和client_id与获取令牌时使用的参数完全一致,否则会出现验证失败

内容的提问来源于stack exchange,提问作者m9m9m

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 16:32:18