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

Python验证ADB2C JWT时抛出InvalidSignatureError错误求助

解决ADB2C JWT在Python中验证时的InvalidSignatureError问题

你遇到的问题大概率是ADB2C的Issuer和JWKS URI格式配置错误导致的,以下是具体排查和解决步骤:

1. 修正Issuer和JWKS URI的格式

ADB2C的Issuer和JWKS URI必须包含对应的用户流/自定义策略名称,和通用Azure AD的格式不同:

  • 正确的Issuer格式:https://<你的B2C域名>/tfp/<租户ID>/<策略名称>/v2.0
  • 正确的JWKS URI格式:https://<你的B2C域名>/tfp/<租户ID>/<策略名称>/discovery/v2.0/keys

之前代码中使用的https://login.***.com/{tenant_id}/v2.0这类通用Azure AD地址,无法匹配ADB2C Token的签名密钥,这是导致验证失败的核心原因。

2. 修正后的代码示例

azure_ad_app_id = "app_id"
tenant_id = "你的租户ID"
policy_name = "B2C_1_signup_signin"  # 替换为你的B2C用户流或自定义策略名称
azure_ad_issuer = f"https://your-b2c-domain/tfp/{tenant_id}/{policy_name}/v2.0"
azure_ad_jwks_uri = f"https://your-b2c-domain/tfp/{tenant_id}/{policy_name}/discovery/v2.0/keys"
token = "eyJ0...."

payload = verify_jwt(
    token=token,
    valid_audiences=[azure_ad_app_id],
    issuer=azure_ad_issuer,
    jwks_uri=azure_ad_jwks_uri,
    verify=True,
)

3. 额外排查点

  • 确认签名算法:检查Token头部的alg字段是否为RS256,azure_ad_verify_token默认支持该算法,若使用其他算法需额外配置。
  • 检查Token完整性:确认Token在复制或传输过程中没有被截断,可解析Token的Header和Payload,验证exp(过期时间)、nbf(生效时间)是否在当前时间范围内。
  • 手动验证兜底:如果问题仍存在,可使用PyJWT库手动验证,确保公钥匹配:
import jwt
import requests
import json

def get_public_key(jwks_uri, kid):
    response = requests.get(jwks_uri)
    jwks = response.json()
    for key in jwks["keys"]:
        if key["kid"] == kid:
            return jwt.algorithms.RSAAlgorithm.from_jwk(json.dumps(key))
    raise ValueError("未找到匹配的公钥")

token_header = jwt.get_unverified_header(token)
public_key = get_public_key(azure_ad_jwks_uri, token_header["kid"])

payload = jwt.decode(
    token,
    public_key,
    algorithms=["RS256"],
    audience=azure_ad_app_id,
    issuer=azure_ad_issuer,
    options={"verify_signature": True}
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:10:33