Почему я получаю запрещенный ответ от API-интерфейса графа при попытке создать подписки в календарях пользователей?

Мое приложение использует делегированные токены доступа пользователя для взаимодействия с 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 подойдет. Или я что-то еще упускаю?


person Elyes Graba    schedule 13.05.2020    source источник


Ответы (1)


Вам нужно Calendars.Read, как указано в documentation, чтобы подписаться на календарь текущего пользователя.

person baywet    schedule 14.05.2020
comment
Верно, у моего приложения есть делегированное разрешение Calendars.ReadWrite.Shared, которое согласно документам. является надмножеством Calendars.Read, мне не нужно явно запрашивать Calendars.Read. В любом случае, я попытался явно запросить Calendars.Read в дополнение к Calendars.ReadWrite.Shared, и проблема осталась. Самый последний request-id из innerError в ответе — 70404269-c0b9-48c6-b7b5-8138ab7c260a. Можно ли получить более подробную информацию оттуда? - person Elyes Graba; 15.05.2020
comment
Если приложение Calendars.Read не работает, обратитесь в службу поддержки для изучения проблемы developer.microsoft. .com/en-us/graph/support - person baywet; 15.05.2020