访问令牌不明确的共享点列表

Accessing sharepoint list with token unclear

我只想从域中名为 prod 的组(或站点?)中名为 dataacq 的列表中提取数据(或根站点?)tenant.sharepoint.com(或tenant-my.sharepoint.com?)并将其放入DataFrame。

我对通过 app.acquire_token_silent 获得的令牌有疑问。

Microsoft 文档难以理解,因为它太重而且几乎没有可用的 cookbooks/working 示例(从我的众多问号可以看出)。此外,他们似乎想将所有 API 集中到 graph.microsoft.com 中,但没有警告说 tenant.sharepoint.com/sites/prod/_api/ 将要停止。

我已经从我的应用程序的 Azure 门户获得了以下权限。

我不相信我需要所有这些,但我不确定。我只想读一个列表。那么只需要 Microsoft Graph > Sites.read.All 吗?还是 Sharepoint > Allsites.Read ? 我知道我都有“仅限应用程序”权限和“登录用户”权限。

我确实下载了“快速入门”示例并阅读了 https://msal-python.readthedocs.io/en/latest/。尽管使用 app.acquire_token_silent 成功提取了令牌,但使用返回的令牌总是会抛出一些错误,无论 scope('https://microsoft.sharepoint-df.com/.default' 或 'https://graph.microsoft.com/.default')或 API 域(graph.microsoft.comtenant.sharepoint.com) 我正在请求中使用:

{'error_description': 
     "Exception of type 'Microsoft.IdentityModel.Tokens.AudienceUriValidationFailedException' was thrown."}
{'error': {'code': 'AccessDenied',
  'message': 'Either scp or roles claim need to be present in the token.',
  'innerError': {'date': '2021-02-19T08:05:16',
   'request-id': '01efc071-18e6-4006-8780-f771419ebe3e',
   'client-request-id': '01efc071-18e6-4006-8780-f771419ebe3e'}}}

另一方面,有一个 API 开发人员测试门户。当我将此门户中提供的令牌复制到我的 python 代码中时,两个 scope/API 域都有效。

例如一个示例,适用于从门户复制和粘贴令牌,但不适用于 app.acquire_token_silent 方法颁发的令牌:

r = requests.get(  # Use token to call downstream service
        fr'https://graph.microsoft.com/v1.0/sites/root:/sites/prod:/lists/{list_id}/items?expand=fields(select=Created))',
        headers={'Authorization': 'Bearer ' + result['access_token'],},)

所以问题出在这个 app.acquire_token_silent 方法或配置文件上。但返回的响应似乎没问题:

{'token_type': 'Bearer',
 'expires_in': 3599,
 'ext_expires_in': 3599,
 'access_token': '...'}

我错过了什么?

根据您在描述中提供的代码r = requests.get.....,您似乎使用了microsoft graph api来实现它。如果您使用此 api,则应使用 https://graph.microsoft.com/.default 作为 scope 来获取访问令牌。您可以将访问令牌复制到此page,解码令牌并检查其中是否包含权限。

并且根据您注册的应用程序的“API权限”选项卡的屏幕截图,还请对权限Sites.Read.All进行grant admin consent操作虽然它显示不需要管理员同意。

==================================更新== =============================

似乎方法 acquire_token_silent() 通过客户端凭证流获取访问令牌。所以我们应该在注册的应用程序中添加“Application”类型权限而不是“Delegated”权限。