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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:18:13