Python调用Microsoft Access Token接口遇400 Bad Request错误求助
排查Microsoft OAuth2.0令牌请求400错误的步骤
1. 核对请求参数的完整性与正确性
令牌请求必须包含以下必填参数,缺一不可:
grant_type:固定值为authorization_codecode:直接使用获取到的完整授权码字符串(不要带code=前缀)client_id:你的Azure AD应用注册的客户端IDredirect_uri:必须和获取授权码时使用的地址完全一致(包括协议、域名、路径,大小写也要严格匹配)client_secret(仅机密客户端,如Web应用需要):应用注册的客户端密钥
如果是桌面类公共客户端,请勿添加client_secret参数,否则会触发错误。
2. 确认授权码的有效性
- 授权码仅能使用一次,一旦尝试过兑换令牌(哪怕失败),都需要重新获取新的授权码
- 授权码有效期通常为10分钟,若获取后间隔过久再请求令牌,会直接失效
3. 检查请求的提交方式与内容类型
- 必须使用
POST请求,且请求头的Content-Type需设置为application/x-www-form-urlencoded,不能用JSON格式提交参数 - 参数需以键值对形式编码,避免多余空格或转义错误,示例格式:
grant_type=authorization_code&code=xxx&client_id=xxx...
4. 验证应用注册的配置
- 确认应用注册后台已添加对应的
redirect_uri,且类型匹配(如Web应用选Web类型,桌面应用选公共客户端/移动类型) - 如果请求中包含
scope参数,需确保这些权限是获取授权码时已申请的,且应用注册已获得对应权限
5. 获取具体错误详情
修改代码捕获并打印响应的具体内容,这是定位问题的核心:
import requests try: response = requests.post( "https://login.microsoftonline.com/common/oauth2/v2.0/token", data={ "grant_type": "authorization_code", "code": "你的授权码", "client_id": "你的客户端ID", "redirect_uri": "你的重定向URI", "client_secret": "你的客户端密钥(按需添加)" } ) response.raise_for_status() except requests.exceptions.HTTPError as e: print("错误详情:", response.text) raise
响应文本中的error和error_description字段会给出明确原因,比如invalid_grant(授权码无效)、redirect_uri_mismatch(重定向URI不匹配)等。
6. 核对授权码获取流程的一致性
确保获取授权码的请求中,response_type为code,且client_id、redirect_uri、scope参数和令牌请求中的完全一致,无遗漏或错误。
内容的提问来源于stack exchange,提问作者SLA
相关产品推荐
相关产品推荐

