我的应用程序使用委托用户访问令牌与MSFT图形API交互。他们有 Calendars.ReadWrite.Shared
允许。当向 https:/graph.microsoft.comv1.0订阅。 在生产中,请求体如下。
{
"changeType": "created,updated,deleted",
"notificationUrl": <https_app_notification_url>,
"resource": "/me/calendars/<calendar_id>/events",
"expirationDateTime": (datetime.now(timezone.utc) + timedelta(minutes=4200)).isoformat(),
"clientState": <a_crypto_random_string>
}
几乎每次响应都是一个错误,在响应体中包含以下内容。
[Status Code: Forbidden; Reason: Access is denied. Check credentials and try again.]
最近一次出现的错误有以下内容: 1. innerError
的响应中。
{'date': '2020-05-13T20:58:09', 'request-id': '1448e490-9e45-4a08-9aab-dd9c996c18db'}
即使在尝试订阅用户自己的默认日历时也会发生这种情况。
奇怪的是,完全相同的代码,当在我的本地机器上运行,并通过ngrok隧道到web上暴露我的应用程序的notificationUrl端点时,能够始终如一地从MSFT的订阅端点得到一个201。
我已经检查了服务器上的系统时间与 date
命令,而我的本地机器和服务器之间相差不到1秒。所以我不认为 expirationDateTime
字段是问题所在;它有30分钟的缓冲时间,因为我相信最大的缓冲时间是根据。文献 是4230。
我应该在oauth作用域中为用户访问令牌申请额外的权限吗?文档中 据说 Calendars.Read
够了 Calendars.ReadWrite.Shared
会做到这一点。还是我还遗漏了什么?
你需要 Calendars.Read
中所概述的 文件 来订阅当前用户的日历。