当前位置: 首页 > 知识库问答 >
问题:

创建Microsoft Graph API订阅是否需要特定权限?

柴寂离
2023-03-14

我试图使用create subscription API来打开一个日历事件的订阅通道,这样我们就可以在面试者对面试做出回应时收到更新。

我已经尝试了许多不同的方法来实现这个请求:

我已经完成了oauth流程,为具有以下权限范围的用户检索图形访问令牌:

  • 邮件.发送
  • 日历.读写.共享
  • 用户.读基本.全部

使用上述范围的访问令牌,在尝试创建订阅之前,我将带有< code>{eventId}的事件添加到共享日历中,假设用户相对Id为< code>{sharedCalendarId}。

使用相同的访问令牌创建具有上面列出的权限范围的相同授权头,我始终收到相同的< code>ExtensionError响应。下面我将列出我对graph API的请求的各种排列。

已尝试的网址

我已经将订阅帖子请求的每个排列发送到以下URL:

    < Li > < code > https://graph . Microsoft . com/v 1.0/subscriptions < Li > < code > https://graph . Microsoft . com/beta/subscriptions

请求标题

  • 内容类型: 应用程序/json
  • 授权: Bearer {authToken}

请求机构尝试

change eType通知UrlexpirationDateTime对于所有请求都是相同的。我尝试了资源字符串的3种不同变体,并尝试了带有和不带有clientState的请求。

首先,我尝试了完全识别的资源并添加了客户端状态

{
  "changeType": "created,updated",
  "notificationUrl": "https://{domain-with-valid-https-certs}/calendar/microsoft/notifications",
  "resource": "users/{userPrincipalName}/calendars/{sharedCalendarId}/events",
  "clientState": "{thisIsLimitedTo128Characters}",
  "expirationDateTime": "2018-05-23T21:02:45.487Z"
}

接下来,为了缩小问题范围,我放弃了<code>clientState而不是{userPrincipalName}:

{
  ...
  "resource": "me/calendars/{sharedCalendarId}/events"
}

然后我放弃了共享日历,看看这是否是问题所在,并使用了文档中的示例资源。

{
  ...
  "resource": "me/events"
}

虽然我似乎收到了对通知Url提供的验证请求(并且服务器做出了适当的响应),但创建订阅的请求随后以此类错误进行响应:

{
  code: "ExtensionError",
  message: "Operation: Create; Exception: [Status Code: Forbidden; Reason: Forbidden]",
  innerError: {
    "request-id": "0d86a983-ea50-4226-905c-38f0e8f12308",
    date: "2018-05-23T03:55:38"
  }
}

令人困惑的是,我试图在我刚刚成功创建或更改的日历和事件上创建此订阅,因此403似乎与访问资源无关。

是否需要授予特定的权限或作用域,以便我们成功创建日历事件的订阅?我们是否应该使用不同的API?

共有2个答案

宣胜
2023-03-14

对于有类似问题但不想深入评论的人,请在这里自我回答。

经过Marc LaFleur和Jason Johnston的一些调试帮助(感谢回复!),我的具体问题的答案是“有点”。

不,没有特定的订阅。*范围,创建订阅通道不需要它们。

但是,确切地说,POST /订阅创建终结点需要比资源本身更具体的权限范围。

在我的示例中,“日历”.ReadWrite.“共享”权限确实允许我的应用在用户的日历和共享日历中读取和写入事件,但我无法为同一日历创建订阅频道。

除了之外,请求Calendars.ReadWrite不那么宽松和更具体的范围Calendars.ReadWrite.Shared解决了我的问题。

章学义
2023-03-14

为了订阅资源,您至少需要对资源的读取权限。因此对于事件,您需要Calendars.Read。因为您有更多,所以应该没问题。(参考)

我相信你的问题是你没有在有效负载中包含expirationDateTime。这是一个必需的属性(这里有记录,可以说不是列出它的最佳位置)。将其设置为等于或小于日历的最大值,4230分钟(参考)。

 类似资料:
  • 我有两个版本的应用程序: > 没有广告。 我的应用程序中有订阅。我想在这些应用程序之间共享一个订阅。例如这样一个场景: 用户在应用程序中购买带有广告的订阅,然后购买没有广告的应用程序。我想将第一个应用程序中的订阅分享给第二个应用程序。有没有可能使用标准的谷歌账单库?

  • 创建一个条纹客户非常容易,将一张卡与该客户关联起来,然后随时向他们收费。然而,使用Laravel出纳之后,在任何时候订阅用户的计划都不那么容易。 当用户在“我的设置”中添加卡时,会生成卡令牌。我已尝试在此时存储令牌,并在用户希望更新其订阅时使用它,但出现错误:

  • 我需要创建对的订阅,该订阅在第一次调用时立即被处理掉。 有没有像这样的东西: 我的用例是,我正在一个快速路由处理程序中创建一个订阅,每个请求都会多次调用该订阅。

  • 我想将架构导入我的新主机。首先,我创建了新的用户帐户: 我需要授予什么样的特权才能拥有超级角色? (创建模式,表,包,触发器等) 允许我访问所有这些是一种特权?

  • 当我知道observable在组件/类超出作用域之前肯定会完成(使用或通知)时,我还需要取消订阅它以防止内存泄漏吗?换句话说,是否自动完成/错误的可观察清理,这样我就不用担心了?

  • 我目前正在尝试将我的应用程序迁移到firebase,我正在寻找firebase的解析安装和通道。 我发现我们应该使用主题,但在我的应用程序中,“订阅”和“取消订阅”主题很常见,但没有办法(我发现)看到用户订阅了哪些主题。有什么想法吗? 我已经阅读了Firebase文档,但我是Firebase新手,因此可能有更多经验的人会知道:https://firebase.google.com/docs/clo