访问令牌不明确的共享点列表
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.com
或 tenant.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”权限。
我只想从域中名为 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.com
或 tenant.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”权限。