【问题标题】:Microsoft Graph Api : Insufficient privileges to complete the operationMicrosoft Graph Api:权限不足,无法完成操作
【发布时间】:2018-05-29 14:59:00
【问题描述】:

我正在尝试使用 Microsoft Graph 从 OneDrive 下载文件。我目前处于测试阶段,还没有写任何代码。

这是我到目前为止所做的:

  1. 通过https://apps.dev.microsoft.com创建并注册了一个应用程序
  2. 生成了一个秘密,启用了隐式流
  3. 为其提供了以下 Microsoft Graph 权限列表:

    委托Files.ReadWrite.Alloffline_accessGroup.ReadWrite.AllDirectory.ReadWriteAllUser.ReadWriteAll

    应用程序Directory.ReadWrite.AllFiles.ReadWrite.AllGroup.ReadWrite.AllUser.ReadWrite.All

    1. 使用code 流,范围为offline_accessFiles.ReadWrite.All,获得代码和令牌。

    2. 使用此令牌通过/me 驱动器下载文件效果很好(/v1.0/me/drive/items/itemid/content),但是当我尝试下载或仅查询其他用户时,我得到了权限不足的错误。

调用https://graph.microsoft.com/v1.0/users得到响应:

{
  "error": {
    "code": "Authorization_RequestDenied",
    "message": "Insufficient privileges to complete the operation.",
    "innerError": {
      "request-id": "cee06586-12af-4768-9135-b9709d7ecb5d",
      "date": "2018-05-29T14:45:48"
    }
  }
}

当我添加用户 ID 时也会发生同样的情况。当我要求获取用户的设备时,我得到“未找到”响应。

我看到一些类似问题的答案说我应该通过 Azure 门户将我的应用程序的权限添加到 Azure Active Directory,但我的应用程序仅列在“企业应用程序”部分中,我在我可以添加权限的“应用注册”部分,在企业应用程序部分我无法添加任何权限,只能搜索。

注意:我的用户 ID 是 Azure 门户中的全局管理员。该用户也是创建并拥有该应用程序的用户。

知道我在这里可能缺少什么吗?

谢谢

编辑

我取得了一些进展,我尝试通过 Azure 门户而不是应用程序门户创建应用程序。现在它显示在应用注册页面中,因此我可以为其添加权限。

所以现在我可以查看所有用户,但是当我尝试查看他们的驱动器时,我得到“未找到”响应:

调用https://graph.microsoft.com/v1.0/users/userid/drive返回响应:

{
  "error": {
    "code": "itemNotFound",
    "message": "The resource could not be found.",
    "innerError": {
      "request-id": "ec6ed197-15ea-498a-80d0-e2a9f832a0b9",
      "date": "2018-05-29T15:49:18"
    }
  }
}

【问题讨论】:

  • 您的用户可以访问其他人的驱动器吗?您通过授权码流获得的令牌是应用+用户,这意味着应用和用户都必须有权访问资源才能获得访问权限。
  • 您还可以在jwt.ms 再次检查访问令牌是否包含必要的范围,但如果范围无效,/me/drive 调用应该会失败。
  • @juunas - 据我了解,我的用户是全局管理员,因此应该能够访问其他人的驱动器。我该如何检查?
  • 对,这很奇怪。您可以尝试使用图形资源管理器graph.microsoft.io

标签: json microsoft-graph-api onedrive


【解决方案1】:

调用/users 要求您至少拥有User.ReadBasic.AllUser.Read.All 权限。由于您只请求了Files.ReadWrite.All,因此您没有足够的权限通过其他用户的配置文件进行访问。

尽量不要使用范围:

User.Read.All+Files.ReadWrite.All+offline_access

【讨论】:

  • 对给定驱动器项目的请求应该可以正常工作。然而,OP 调用的是用户的 (/users) 或用户的个人资料 (/users/{id})。这些需要User.Read.All。如果您知道文件的id,则调用/users/{id}/drive/items/{id} 应该只使用Files.ReadWrite.All
  • @MarcLaFleur 请注意我的编辑,我能够通过 azure 门户创建应用程序并为其授予 AD 权限来克服用户问题,这意味着我现在确实看到了用户以及特定用户。但是我仍然没有看到用户开车。我试图添加到范围 Directory.Read.All 但这没有帮助。文档方面,我在 Microsoft 文档中没有看到任何地方表明允许范围像“x + y”那样结构化 - 你能指出你在哪里看到的吗?文档让我相信只有极少数可能的范围,用户不是其中之一
  • 我不确定您正在查看哪些文档,但 Microsoft Graph 使用了 a bunch of scopesscope+scope 语法只是 scope scope 的 URL 编码版本。 URL 编码将每个space 转换为+
【解决方案2】:

好的,我设法通过在没有用户的情况下询问令牌来解决这个问题: https://developer.microsoft.com/en-us/graph/docs/concepts/auth_v2_service。 它拥有所有必需的权限,我可以下载我需要的任何文件。感谢 Marc 和 Juunas 帮助我解决这个问题。

【讨论】:

    最近更新 更多