我想创建一个简单的Python实用程序,与OneDrive上的文件进行交互。现在我正在使用我的公司帐户(因此我无法访问管理员设置或对OneDrive/Sharepoint/Azure配置的任何详细见解)。
经过快速的谷歌搜索,似乎Microsoft图是要走的路。我从复制示例应用程序开始,一旦我确认基本功能正常工作(它显示了我的个人资料中的名称等)。我尝试添加一个简单的调用me/drive/root/children
以列出根目录中的文件。而且我无法让它工作。
无论我做什么,服务器都会返回以下内容:
{'@odata.context': "https://graph.microsoft.com/v1.0/$metadata#users('my_oid')/drive/root/children", 'value': []}
这个问题以前也发生在几个人身上,所以我试着跟着他们的小路走。到目前为止,我检查了:
- 应用程序具有看似正确的静态权限:
Files.Read
、Files.Read.All
、Files.ReadWrite
、Files.ReadWrite.All
、openid
、profile
、User.Read
甚至Sites.ReadWrite.All
- 这些权限不需要管理员的批准,所以我想它们应该可以工作
me/drive/root/?expand=children
返回带有文件系统信息等的正确数据。me/drive/root/children?$whatif
返回查询的正确 URL:https://{tenant}-my.sharepoint.com/personal/{username}/_api/v2.0/drive/root/children
- 如果我在具有活动OneDrive会话的浏览器中打开此URL,它将返回带有根文件夹中文件列表的JSON(因此确实是正确的)
- 弄乱
adal
库并将scope=files.readwrite.all
添加到所有OAuth查询(无更改)。 - 使用
/user/{oid}/drive/root/children
查询(无更改,?$whatif
建议此映射到同一 SharePoint URL)
这些都不起作用。这里可能缺少什么?
编辑:缺少的是用户同意 - 我已经添加了权限,但系统从未在登录尝试后询问我有关更改的信息。评论中提供的解决方案有效 - 您只需要打开像这样制作的 URL:
https://login.microsoftonline.com/{tenant}/oauth2/authorize?client_id={your_client_id}&response_type=code&response_mode=query&resource=https://graph.microsoft.com&state=12345&prompt=consent
同意新的权限,瞧!干得好女士。
更新权限后,用户和/或管理员必须再次同意。可以通过 URL 请求强制用户同意,或者只需在 Azure 门户中单击"授予管理员同意按钮"。
https://login.microsoftonline.com/{tenant}/oauth2/authorize? client_id={your_client_id} &response_type=code &response_mode=query &resource=https://graph.microsoft.com &state=12345 &prompt=consent