在使用Partner Center API时发生403客户端错误
我打算使用Partner Center API来完成若干任务(本文将获取客户列表)。
我在我的租户中完成了以下任务:
API权限(它们已为租户授予): 点击查看图片
在Partner Center,应用已成功添加到应用列表中。

--
我有以下Python脚本,用来查询Partner Center API:
import requests
import json
client_id = "myAppID"
client_secret = "myAppSecret"
tenant_id = "myTenantID"
def getTokenPC():
url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token"
payload = {
"grant_type": "client_credentials",
"client_id": client_id,
"client_secret": client_secret,
"scope": "https://api.partnercenter.microsoft.com/.default"
}
r = requests.post(url, data=payload)
r.raise_for_status()
return r.json()["access_token"]
def getClients(token):
url = f"https://api.partnercenter.microsoft.com/v1/customers"
headers = {
"Authorization": f"Bearer {token}",
"Accept": "application/json",
}
r = requests.get(url, headers=headers)
r.raise_for_status()
return r.json()
partnerCenterToken = getTokenPC()
clients = getClients(partnerCenterToken)
当我运行脚本时,成功获取了Bearer Token,然后用于访问Partner Center API。
然而,当我查询它以获取我的客户列表时,出现如下错误:
requests.exceptions.HTTPError: 403 Client Error: Forbidden for url: https://api.partnercenter.microsoft.com/v1/customers
我在这个论坛上搜索过。一些帖子提到要给我的应用分配一个“Manager”角色,但我在Partner Center找不到它。
我猜问题在于我的Bearer Token缺少访问API所需的全部信息,无法“解锁”访问权限。
也许是某种原因……
如果你需要更多信息,尽管告诉我。
解决方案
好吧,问题在于Partner Center有自己的权限系统,独立于Azure AD。即使你的应用在Azure中拥有正确的API权限,你仍然需要在Partner Center直接为你的应用分配一个角色,见 Set up API access in Partner Center
完成后,更新你的 getClients 函数以包含 MS-PartnerCenter-Application-Name
def getClients(token):
url = "https://api.partnercenter.microsoft.com/v1/customers"
headers = {
"Authorization": f"Bearer {token}",
"Accept": "application/json",
"MS-PartnerCenter-Application-Name": "your-app-name"#i mean ts one in the header
}
r = requests.get(url, headers=headers)
r.raise_for_status()
return r.json()
一旦获得角色,你的令牌将携带正确的声明,403应该会消失。若有用,请告诉我。
备选方案
我找到了一个解决问题的方法。
一开始我们在Partner Center将我的应用注册为原生应用。
然而我使用客户端凭据流程。若你遵循 这份文档 你可以看到如下句子:“有两种不同类型的应用——Web应用和原生应用。Web应用同时支持应用仅凭据和应用+用户认证,而原生应用只支持应用+用户认证。”
因此我改用网络应用。总体机制是相同的,但你只能拥有其中一种(至少在我的租户里如此)。
我已在代码中更新了凭据,现在可以请求Partner Center API。以下是结果
我猜这不是最好的做法,但确实能用。


