【问题标题】:Create subscription for OneDrive Business returns 403 forbidden为 OneDrive Business 创建订阅返回 403 禁止
【发布时间】:2019-09-18 00:37:43
【问题描述】:

我正在使用 Microsoft Graph API 来构建 OneDrive 并与之集成。一切正常,我已经能够注册我的应用程序、获取令牌、导航 OneDrive 项目和下载文件。

我开始创建订阅以在用户执行某项操作时接收来自 OneDrive 的通知。当用户使用他们的“个人帐户”登录时,这没有任何问题,但是当他们使用“工作或学校”帐户时,我收到以下错误消息:

{
  "error": {
    "code": "ExtensionError",
    "message": "Operation: Create; Exception: [Status Code: Forbidden; Reason: The caller does not have permission to perform the action.]",
    "innerError": {
      "request-id": "ffaf7fae-e0b0-4cd8-b911-bac4c2fb290a",
      "date": "2019-09-18T00:18:40"
    }
  }
}

这是我创建订阅的调用:

curl -X POST \
  https://graph.microsoft.com/v1.0/subscriptions \
  -H 'Authorization: Bearer [access_token]' \
  -H 'Content-Type: application/json' \
  -H 'Host: graph.microsoft.com' \
  -d '        {
            "resource": "me/drive/root",
            "changeType": "updated",
            "clientState": "[email_Address]",
            "notificationUrl": "https://webhook_url",
            "expirationDateTime": "2019-09-19T04:43:47.6099364+00:00"
        }'

用户拥有Files.ReadWrite.All 权限,基于documentation 应该足够了。

【问题讨论】:

  • @MarcLaFleur 基于documentation 委托权限不需要管理员同意
  • 用户能否在浏览器中查看其 OneDrive?
  • @MarcLaFleur 是的,当然可以。如上所述,我可以毫无问题地调用 API,甚至可以下载文件。这里的问题是创建订阅。
  • 供将来参考,过去曾出现过未正确配置 OD 的问题,典型症状是无法打开 OD UI。所以不,假设“他们当然可以”并不总是安全的。

标签: microsoft-graph-api onedrive


【解决方案1】:

我遇到了同样的问题。唯一的区别是我试图在商业 OneDrive 路径 /users/<id>/drive/root 上设置 driveItem 订阅,但在响应中遇到与您相同的错误。

因此,使用相同的访问令牌,我做了一个GET /v1.0/users/<id>/drive/root 并从响应中获取父级的driveId。然后我尝试在/drives/<driveId>/root 创建订阅,并且成功了。所有请求都使用相同的访问令牌,并且以前的方式用于工作数月。

因此,您可以尝试为您的 /me/drive/root 执行 GET 并查看是否可以使用 driveId 进行设置。

作为奖励,订阅现在像我预期的那样发送网络挂钩。

【讨论】:

  • 谢谢@eric-olson! /drives/<driveId>/root 适用于个人和企业驱动器。
  • 也对我有用,这实际上是最近添加到图形 api 的一项重大更改。对我来说,我使用 /drives//root 因为通过 GET 返回到 /users//drive/root 端点的 ID 不是有效的 driveId
  • /users/<userId>/drive/root 不是有效的 drive Id,因为它不是驱动器,而是驱动器中的文件夹。如果您调用/me/drive,则iddrive 标识符。如果您调用/me/drive/root/,则id 是标识的driveItem。您将在 parentReference.driveId 属性下找到 drive 标识符。
  • 可能跑题了,但您知道 One Drive 是否仍然不允许订阅驱动器中的单个项目吗?
  • 有人使用这种方法得到空的resourceData吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
  • 2011-05-31
相关资源
最近更新 更多