使用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
相关产品推荐
相关产品推荐

