使用Python Requests调用Azure AADB2C认证时遇G21错误的排查求助
AADB2C认证G21错误诊断方法
以下是针对你遇到的AADB2C G21错误的具体诊断步骤,结合你已有正常运行代码的情况,重点通过对比排查问题:
逐行对比正常代码与异常代码的请求细节
- 核对请求URL:检查租户ID、策略名称、端点路径(如
/oauth2/v2.0/token或自定义策略端点)是否完全一致,B2C策略名称的大小写、拼写错误是常见诱因 - 对比请求头:重点检查
Content-Type、User-Agent、Referer、Authorization(若有),部分B2C策略会校验User-Agent是否为合法客户端,或Referer是否匹配允许的域名 - 校验请求体参数:逐一对比所有表单字段(如
username、password、grant_type、client_id、scope、nonce、state等)的字段名、大小写、值的格式,尤其注意是否遗漏浏览器请求中包含的隐藏字段(如__RequestVerificationToken这类防伪令牌),以及密码等含特殊字符的参数是否正确编码
- 核对请求URL:检查租户ID、策略名称、端点路径(如
检查请求编码与格式一致性
- 确认请求体的编码方式:若浏览器使用
application/x-www-form-urlencoded,则需用Requests的data参数传递表单数据,而非json参数(后者会发送application/json格式的请求,多数B2C令牌端点不支持) - 验证参数的URL编码:确保特殊字符(如
&、=、@)已正确编码,浏览器会自动处理这类编码,手动编写代码时容易遗漏
- 确认请求体的编码方式:若浏览器使用
排查状态参数与令牌有效性
- 若使用授权码流程:确认
code未过期、state与授权请求时完全一致、nonce匹配之前生成的随机值且未重复使用 - 若使用密码流:检查
grant_type是否为password,client_id是否正确,且该客户端在B2C租户中已被允许使用密码流(部分租户会禁用该流程)
- 若使用授权码流程:确认
模拟浏览器请求上下文
- 复用浏览器请求的Cookie:将浏览器正常请求中的Cookie复制到Requests的
cookies参数中,部分B2C策略依赖会话Cookie验证请求来源合法性 - 完全复制浏览器的请求头:包括
Accept、Accept-Language等看似无关的字段,部分严格的B2C环境会对这些字段做校验
- 复用浏览器请求的Cookie:将浏览器正常请求中的Cookie复制到Requests的
启用Requests调试日志
- 开启详细日志查看实际发送的请求内容,对比正常请求的细节:
import logging import requests from http.client import HTTPConnection HTTPConnection.debuglevel = 1 logging.basicConfig() logging.getLogger().setLevel(logging.DEBUG) requests_log = logging.getLogger("requests.packages.urllib3") requests_log.setLevel(logging.DEBUG) requests_log.propagate = True - 运行异常代码后,查看日志中的请求行、请求头、请求体,与正常请求的抓包内容逐字节对比,找出差异点
- 开启详细日志查看实际发送的请求内容,对比正常请求的细节:
内容的提问来源于stack exchange,提问作者samronaldo309
相关产品推荐
相关产品推荐

