Мое приложение использует делегированные токены доступа пользователя для взаимодействия с API графа MSFT. У них есть разрешение Calendars.ReadWrite.Shared
. При отправке запросов на https://graph.microsoft.com/v1.0/subscriptions в производстве со следующим телом запроса:
{
"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.]
При последнем возникновении этой ошибки в ответе было следующее innerError
:
{'date': '2020-05-13T20:58:09', 'request-id': '1448e490-9e45-4a08-9aab-dd9c996c18db'}
Это происходит даже при попытке подписаться на собственный календарь пользователя по умолчанию.
Странно то, что точно такой же код при запуске на моем локальном компьютере и туннелировании в Интернет через ngrok для предоставления конечной точки уведомления Url моего приложения может последовательно получать 201 из конечной точки подписки MSFT.
Я проверил системное время на сервере с помощью команды date
, и между моим локальным компьютером и сервером разница составляет менее 1 секунды. Поэтому я не думаю, что проблема в поле expirationDateTime
; у него встроенный буфер на 30 минут, так как я считаю, что это максимум согласно в документах составляет 4230.
Должен ли я запрашивать дополнительные разрешения в областях oauth для токенов доступа пользователя? документы говорят, что Calendars.Read
достаточно, поэтому я думал, что Calendars.ReadWrite.Shared
подойдет. Или я что-то еще упускаю?