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

使用Python验证Azure获取的JWT时遭遇InvalidSignatureError错误求助

使用Python验证Azure获取的JWT时遭遇InvalidSignatureError错误求助

嘿,我之前也踩过这个坑!咱们一步步来排查可能的问题,帮你搞定这个签名错误:

最常见的几个原因及解决办法

  • 公钥没取对或没匹配上token的kid
    Azure的JWT签名用的公钥是从租户的OpenID配置端点动态获取的,不能随便找个公钥硬怼。你得先请求https://login.microsoftonline.com/{你的tenant_id}/v2.0/.well-known/openid-configuration拿到jwks_uri,再从这个URI获取JWKS密钥集,然后根据token头部里的kid字段,找到对应的公钥来验证。

  • 算法指定错误
    Azure的JWT默认用的是RS256非对称加密算法,你在调用jwt.decode()的时候,必须明确指定algorithms=["RS256"],不然库可能会用默认的HS256等对称算法,自然会验证失败。

  • 受众(audience)或签发者(issuer)不匹配
    验证时必须指定正确的audience(就是你的Azure应用客户端ID)和issuer(格式一般是https://login.microsoftonline.com/{tenant_id}/v2.0/),这两个参数不匹配也会触发签名错误的提示(虽然本质是校验不通过,但有时候会被归到签名错误里)。

给你一个修正后的示例代码

import jwt
import requests

def verify_azure_jwt(token, tenant_id, client_id):
    # 获取Azure AD的OpenID配置
    openid_config = requests.get(
        f"https://login.microsoftonline.com/{tenant_id}/v2.0/.well-known/openid-configuration"
    ).json()
    # 获取JWKS密钥集
    jwks = requests.get(openid_config["jwks_uri"]).json()
    
    # 从token头部拿到kid,匹配对应的公钥
    unverified_header = jwt.get_unverified_header(token)
    target_key = None
    for key in jwks["keys"]:
        if key["kid"] == unverified_header["kid"]:
            target_key = key
            break
    if not target_key:
        raise ValueError("找不到与token匹配的公钥")
    
    # 验证并解码token
    try:
        decoded_token = jwt.decode(
            token,
            target_key,
            algorithms=["RS256"],
            audience=client_id,
            issuer=openid_config["issuer"]
        )
        return decoded_token
    except jwt.exceptions.InvalidSignatureError:
        raise Exception("签名验证失败,请检查公钥、算法参数或token本身有效性")

额外提醒

  • 确认你的tenant_id、client_id没有拼写错误,这些参数错一个都不行
  • 检查从Postman拿到的token是否过期,或者是不是拿错了类型(比如把id_token当成了access_token,两者的验证规则有细微区别)
  • 尽量不要把敏感信息硬编码在代码里,用环境变量来管理更安全

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 13:19:28