无法通过REST API访问OneDrive中与用户共享的文件夹内容

时间:2018-02-09 19:02:46

标签: rest microsoft-graph onedrive

我们有一个Windows客户端应用程序,它通过Graph REST API与OneDrive集成。最近,我们开始添加对与当前用户共享的内容的支持,特别是文件夹。我们可以通过以下方式访问这些项目:

获取https://graph.microsoft.com/v1.0/me/drive/sharedWithMe

但是在访问返回的项目时遇到了问题。当我尝试:

获取https://graph.microsoft.com/v1.0/drives/RemoteDriveID/items/RemoteItemID/children

我收到404错误"无法找到资源。"当我尝试将远程站点ID放在那里时(仅包括站点ID和描述的三元组) here)格式为:

获取https://graph.microsoft.com/v1.0/sites/RemoteSiteID/drives/RemoteDriveID/items/RemoteItemID

我得到400错误"提供的id不适合当前的主机"。根据文档,我使用的所有ID都来自remoteItem facet。我们的应用程序具有Files.ReadWrite.All和Sites.ReadWrite.All权限。对服务器的所有其他调用都有效,因此它不是OAuth或基本请求问题。从其他帖子看,其他人似乎都没有遇到这个问题或从未解决过他们的问题。

我们的最终目标是与用户共享一个文件夹,以便我们的应用程序同步内容。

1 个答案:

答案 0 :(得分:0)

自从您问@JackHunsinger以来已经有一段时间了,但是之前的文件夹共享方案对我来说有用。

我正在使用为用户A获取的访问令牌,并使用如下请求创建共享权限:

POST https://graph.microsoft.com/v1.0/drives/<driveId>/items/<folderId>/invite
Content-type: application/json
{
    {
        "recipients":
        [
          { "email": "<user B email>" }
        ],
        "requireSignIn": true,
        "roles": [ "write" ]
    }
}

获取此回复:

{
    {

   "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#Collection(permission)",
        "value":
        [
            {
                "@odata.type": "#microsoft.graph.permission",
                "id": "<permissionId>",
                "roles": [ "write" ],
                "shareId": "<shareId>",
                "grantedTo":
                {
                    "user": { "displayName": "<user B>", "id":"<user B id>" }
                },
                "invitation":
                {
                    "email": "<user B email>",
                    "signInRequired": true,
                    "invitedBy": { "user": { "id": "<user B email>" } }
                },
                "link": { "webUrl": "https://1drv.ms/u/s!<shareId>" }
            }
        ]
    }
}

后来,用户B正在检索文件夹内容,例如:

GET https://graph.microsoft.com/v1.0/drives/<driveId>/items/<folderId>?$expand=children

其中两个请求中的driveIdfolderId相同。即用户B使用remoteItem构面,就像问题中写的一样。

也许将上述权限json与所获得的内容进行比较,将有助于您查找问题:-)

在您的应用未创建许可的情况下,您可以通过以用户A的身份发送该文件夹来检查该文件夹的许可,这可能会很有用。

GET https://graph.microsoft.com/v1.0/drives/<driveId>/items/<folderId>/permissions

好奇心的记录(对于@DanSilver来说可能很有趣...)

  • 顺便说一句,<user B email>出现在许可中的"invitedBy"下-我希望在那里看到<user A email> ...

  • 同样值得注意的是-我认为-shareId与其他OneDrive用户共享并不是真正需要的。它仅与/shares端点一起使用,似乎只能进行读取。