Требуется ли для создания подписки Microsoft Graph API определенные разрешения? - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь использовать API создания подписки, чтобы открыть канал подписки на события календаря, чтобы мы могли получать обновления, когда интервьюеры отвечают на интервью.

Я пробовал много вариантов, чтобы получить этот запросработа:

Области разрешений

Я прошел процесс oauth, чтобы получить токены доступа к графу для пользователя со следующими областями разрешений:

  • Mail.Send
  • Calendars.ReadWrite.Shared
  • User.ReadBasic.All

Успешное создание события календаря

Использование токенов доступа с вышеуказанными областями перед попыткой создатьподписка, я добавляю событие с {eventId} в общий календарь, скажем, с относительным идентификатором пользователя {sharedCalendarId}.

Попытки создания подписки

Использованиеодни и те же токены доступа для создания того же заголовка авторизации с областями полномочий, перечисленными выше, я последовательно получаю один и тот же ответ ExtensionError.Ниже я перечислю различные изменения запроса, которые я сделал в API графа.

Попытки URL-адресов

Я отправил каждую перестановку запросов POST подписки на следующиеURL:

Заголовки запроса

  • Content-Type: application/json
  • Authorization: Bearer {authToken}

Попытка запроса тела

changeType и notificationUrl и expirationDateTime являютсяодинаково для всех запросов.Я попробовал 3 различных варианта строки resource и попробовал запрос с и без 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 вместо {userPrincipalName}:

{
  ...
  "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 ]

0 голосов
/ 24 мая 2018

Самоответ здесь для тех, у кого есть похожая проблема и кто не хочет копаться в комментариях.

После некоторой помощи отладки от Marc LaFleur и Jason Johnston (спасибо за ответы!), Ответ наМой конкретный вопрос «вроде».

Нет, конкретных Subscriptions.* областей нет, и они не нужны для создания каналов подписки.

Но, как ни странно, POST /subscriptionsКонечная точка создания требует более конкретных областей разрешений, чем сам ресурс.

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

Запрос менее разрешительной и более конкретной области действия Calendars.ReadWrite в дополнение к Calendars.ReadWrite.Shared решил мою проблему.

0 голосов
/ 23 мая 2018

Чтобы подписаться на ресурс, вам минимально необходим доступ для чтения к ресурсу.Так что для событий вам понадобится Calendars.Read.Так как у вас есть больше, вы должны быть в порядке.( Ссылка )

Я считаю, что ваша проблема в том, что вы не включили expirationDateTime в полезную нагрузку.Это обязательное свойство (задокументировано здесь , возможно, это не лучшее место для перечисления).Установите для него значение, равное или меньшее максимального значения для календаря, 4230 минут ( Ссылка ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...