在使用Partner Center API时发生403客户端错误

后端开发 2026-07-12

我打算使用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。以下是结果

查看 Partner Center API 调用结果

我猜这不是最好的做法,但确实能用。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章