python - 访问共享点列表时 token 不清楚

标签 python azure sharepoint azure-ad-msal

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

我对通过 app.acquire_token_silent 获取的 token 有疑问。

微软文档难以理解,因为它太重了,而且几乎没有可行的食谱/工作示例(从我的无数问号可以看出)。此外,他们似乎希望将所有 API 集中到 graph.microsoft.com 中,但没有警告 tenant.sharepoint.com/sites/prod/_api/即将停产。

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

我不认为我需要所有这些,但我不确定。我只想读一份 list 。那么只需要 Microsoft Graph > Sites.read.All 吗?或者是 Sharepoint > Allsites.Read ? 我知道我同时拥有“仅限应用程序”权限和“登录用户”权限。

我确实下载了“快速入门”示例,并且阅读了 https://msal-python.readthedocs.io/en/latest/ 。尽管使用app.acquire_token_silent成功提取了 token ,但使用返回的 token 总是会抛出一些错误,无论范围('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 开发人员测试门户。当我将此门户中给出的 token 复制到我的 python 代码中时,范围/API 域都可以工作。

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

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 来获取访问 token 。您可以将访问 token 复制到此 page ,解码token并检查其中是否包含权限。

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

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

似乎方法 acquire_token_silent() 通过客户端凭据流获取访问 token 。因此,我们应该在注册的应用程序中添加“应用程序”类型权限,而不是“委托(delegate)”类型权限。

关于python - 访问共享点列表时 token 不清楚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66329759/

相关文章:

python - spawnProcess 的简单示例

python - 设置数据库变量为全局变量 : Python

azure - 访问策略不可用

Azure 容器实例在启动时更改环境变量

html - 更改轮播宽度

python - 使用 pyinstaller 编译时找不到 exe 文件

python - 在 Python 中捕获 Control-C

windows - 启动Azure VM并自动登录Windows 10

html - 保存富字段后,Microsoft Sharepoint 将 "External Class"添加到我的 CSS

c# - 无法添加具有空角色定义绑定(bind)集合的角色分配