我正在尝试使用create subscription API在日历事件上打开订阅 Channels ,这样我们就可以在采访者回复采访时收到更新 .
我尝试了很多变体来使这个请求起作用:
权限范围
我已经完成了oauth进程,为具有以下权限的用户检索图访问令牌范围:
-
Mail.Send
-
Calendars.ReadWrite.Shared
-
User.ReadBasic.All
成功创建日历活动
使用具有上述范围的访问令牌,在尝试创建订阅之前,我将 {eventId}
的事件添加到共享日历,假设user relative的user relative .
订阅创建尝试
使用相同的访问令牌创建具有上面列出的权限范围的相同Authorization标头,我始终收到相同的 ExtensionError
响应 . 下面我将列出我对图API的请求的各种排列 .
网址试图
我已将订阅POST请求的每个排列发送到以下URL:
-
https://graph.microsoft.com/v1.0/subscriptions
-
https://graph.microsoft.com/beta/subscriptions
请求 Headers
-
Content-Type: application/json
-
Authorization: Bearer {authToken}
请求机构尝试
changeType
和 notificationUrl
以及 expirationDateTime
对于所有请求都是相同的 . 我在 resource
字符串上尝试了3种不同的变体,并尝试使用和不使用 clientState
的请求 .
首先,我尝试了完全识别的资源并添加了 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"
}
接下来,我为了缩小问题而放弃了 clientState
,我使用了 me
而不是:
{
...
"resource": "me/calendars/{sharedCalendarId}/events"
}
然后我放弃了共享日历以查看是否存在问题并使用了资源,这是文档中的一个示例 .
{
...
"resource": "me/events"
}
收到错误响应
虽然我似乎收到了 notificationUrl
提供的验证请求(并且服务器响应正确)创建订阅的请求然后响应此类错误:
{
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 回答
要订阅资源,您至少需要对资源的读访问权限 . 所以对于事件,你需要
Calendars.Read
. 既然你有更多,你应该没事 . (Reference)我相信你的问题是你没有在有效载荷中包含
expirationDateTime
. 这是一个必需的属性(记录here,可能不是列出的最佳位置) . 将其设置为等于或小于日历的最大值,4230分钟(Reference) .对于任何有类似问题并且不想深入评论的人来说,这里都是自我回答 .
经过Marc LaFleur和Jason Johnston的一些调试帮助(感谢回复!),我的具体问题的答案是“有点” .
不,没有特定的
Subscriptions.*
范围,并且创建订阅 Channels 不需要它们 .但是,在语法上,
POST /subscriptions
创建 endpoints 需要比资源本身更具体的权限范围 .在我的示例中,
Calendars.ReadWrite.Shared
权限确实允许我的应用程序读取和写入用户的日历和共享日历的事件,但我无法为同一日历创建订阅 Channels .除了
Calendars.ReadWrite.Shared
之外,请求Calendars.ReadWrite
的较不宽容和更具体的范围解决了我的问题 .