Python请求Dynamics 365 access token报JSONDecodeError
问题根因
你的代码有3个核心错误,导致请求返回的是HTML格式的登录跳转页而非JSON格式的token响应,最终触发JSON解析失败:
- 端点错误:
https://login.microsoftonline.com/common/oauth2/authorize是授权码流程的交互式跳转端点,不支持密码模式直接返回token,密码模式的正确token端点为https://login.microsoftonline.com/common/oauth2/token - 请求方法错误:OAuth2 token获取接口必须使用POST方法提交表单参数,你用了GET方法,服务端不会识别你提交的认证参数
- 参数冗余:你既在URL中拼接了resource参数,又在表单参数中重复传入resource,属于无效冗余配置
可直接运行的正确代码
import requests # 基础配置,替换为你自己的实际值 crmorg = 'https://xxx.crm6.dynamics.com' # Dynamics 365 组织根地址 clientid = '00000000-0000-0000-0000-000000000000' # 应用客户端ID username = 'xxxxxx@xxxxxxxx' # 登录账号 userpassword = 'xxxxxxxx' # 登录密码 # 正确的token获取端点 tokenendpoint = 'https://login.microsoftonline.com/common/oauth2/token' # 构造token请求表单参数 token_post_data = { 'client_id': clientid, 'resource': crmorg, 'username': username, 'password': userpassword, 'grant_type': 'password' } # 发起POST请求获取token token_res = requests.post(tokenendpoint, data=token_post_data) # 先判断请求状态,避免解析错误 if token_res.status_code != 200: print(f"请求失败,状态码:{token_res.status_code},响应内容:{token_res.text}") else: token_data = token_res.json() access_token = token_data['access_token'] print(f"成功获取access token:{access_token[:50]}...") # 后续调用Dynamics 365接口时,将token放到请求头即可,和Postman配置逻辑一致 # 请求头示例:headers = {"Authorization": f"Bearer {access_token}"}
匹配Postman配置说明
- 代码使用
grant_type: password对应Postman中OAuth2.0的密码授权模式 - 后续接口调用时将token放入
Authorization请求头,和你Postman中「授权数据添加位置为Request Headers」的配置完全一致 - 如果使用common端点遇到租户校验错误,可以将端点中的
common替换为你的Azure租户ID即可。
内容的提问来源于stack exchange,提问作者samronaldo309
相关产品推荐
相关产品推荐

