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

