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

Веб-перехватчик — это определяемый пользователем API обратного вызова на основе HTTP, который можно настроить в инфраструктуре для получения уведомлений об изменениях и событий от службы, например Microsoft Graph. Чтобы использовать веб-перехватчики, необходимо определить общедоступную конечную точку, защищенную HTTPS, которая получает уведомления.

Вы можете создать подписку на ресурс, для которого требуется получать уведомления об изменениях. Хотя подписка действительна, Microsoft Graph отправляет уведомление в конечную точку при каждом обнаружении изменений в ресурсе.

В этой статье описывается процесс реализации конечной точки веб-перехватчика, подписки на подписки Microsoft Graph и управления ими, а также получение уведомлений об изменениях с помощью веб-перехватчиков.

Дополнительные сведения о создании уведомлений об изменениях см. в разделе Уведомления об изменениях microsoft API Graph.

Рекомендации по использованию конечной точки веб-перехватчика

Прежде чем получать уведомление через веб-перехватчики, необходимо создать общедоступную конечную точку, защищенную HTTPS, которая может быть адресирована по URL-адресу. Если конечная точка не является общедоступной, Microsoft Graph не отправляет уведомления в конечную точку.

Конечная точка должна предоставлять правильные, согласованные и своевременные HTTP-ответы, чтобы надежно получать уведомления. Если конечная точка не отвечает своевременно, служба уведомлений об изменениях может начать удалять уведомления. Удаленные уведомления не могут быть восстановлены.

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

Коды HTTP и логика повторных попыток

Когда служба уведомлений об изменениях Microsoft Graph получает код класса 2xx от конечной точки, уведомление считается отправленным. Пока служба уведомлений об изменениях получает любой другой ОТВЕТ HTML (даже код ошибки) в течение 10 секунд, служба продолжает пытаться доставить уведомление в течение 4 часов.

  • Если вы можете обработать уведомление в 3-секундном окне, вам следует вернуть 200 - OK код состояния в Microsoft Graph.
  • Если для обработки уведомления вашей службе может потребоваться более 10 секунд, вы можете сохранить уведомление в очереди в конечной точке и вернуть 202 - Accepted код состояния в Microsoft Graph.
  • Если уведомление не обработано или не поставлено в очередь, верните код класса 5xx, указывающий на ошибку, чтобы Microsoft Graph смог повторить попытку уведомления.

Уведомления, которые не доставляются, извлекаются через экспоненциальные интервалы отката. После подключения конечной точки для повторной отправки пропущенных уведомлений может потребоваться до 4 часов.

Регулирование

По соображениям безопасности и производительности Microsoft Graph регулирует уведомления, отправляемые конечным точкам, которые становятся медленными или не отвечают. Это может включать удаление уведомлений таким образом, что их невозможно восстановить.

  1. Конечная точка помечается как "медленная", когда более 10 % ответов занимает больше 10 секунд в 10-минутном окне.

    • После того как конечная точка помечена как "медленная", все новые уведомления отправляются с задержкой в 10 секунд.
    • Конечная точка выходит из состояния "медленно" один раз менее 10 % ответов занимает больше 10 секунд в 10-минутном окне.
  2. Конечная точка помечается как "drop" один раз более 15 % ответов занимает больше 10 секунд в 10-минутном окне.

    • После пометки конечной точки "drop" все новые уведомления удаляются на срок до 10 минут.
    • Конечная точка выходит из состояния "drop" один раз менее 15 % ответов занимает больше 10 секунд в 10-минутном окне.

Если конечная точка не может соответствовать этим характеристикам производительности, рассмотрите возможность использования Центров событий или Сетки событий в качестве целевого объекта для получения уведомлений.

Проверка подлинности

При создании подписки маркер доступа отправляется в конечную точку. Этот маркер доступа используется только для проверка допустимости конечной точки и имеет жизненный цикл, отличный от жизненного цикла подписки на уведомление об изменениях. Срок действия этого маркера доступа обычно истекает в течение 1 часа.

Конечная точка должна быть готова к регулярной повторной авторизации Microsoft Graph, чтобы microsoft Graph могла продолжать доставлять уведомления в конечную точку.

Если срок действия маркера доступа истек, уведомления не доставляются. Однако это не активирует поведение регулирования конечной точки, и Microsoft Graph продолжает повторять отправку каждого уведомления в течение 4 часов. Таким образом, если маркер доступа обновляется в течение 4 часов после истечения срока действия, неотправленные уведомления доставляются.

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

При продлении подписки маркер доступа также обновляется.

Конфигурация брандмауэра

Вы можете настроить брандмауэр, который защищает конечную точку, чтобы разрешить входящие подключения только из Microsoft Graph, уменьшая дальнейшую уязвимость к уведомлениям о недопустимых изменениях. Полный список IP-адресов, которые используются Microsoft Graph для доставки уведомлений об изменениях, см в сведениях одополнительных конечных точках для Microsoft 365.

Примечание.

Указанные IP-адреса, которые используются для доставки уведомлений об изменениях, можно обновлять в любое время без предупреждения.

Создание подписки

Важно!

Необходимо выполнить несколько действий, чтобы обеспечить создание и обслуживание безопасного канала связи между службой уведомлений об изменениях Microsoft Graph и конечной точкой.

Чтобы начать получать уведомления об изменениях в Microsoft Graph, необходимо создать подписку, используя URL-адрес конечной точки (URL-адрес уведомления), чтобы создать подписку. Схема создания подписки выглядит следующим образом:

  1. Клиентское приложение отправляет запрос на подписку для подписки на изменения в определенном ресурсе.

  2. Microsoft Graph проверяет запрос.

    • Если запрос действителен, Microsoft Graph отправляет маркер проверки на URL-адрес уведомления для клиентского приложения для проверки URL-адреса уведомления.
    • Если запрос недопустим, Microsoft Graph отправляет ответ об ошибке с кодом ошибки и подробными сведениями.
  3. Когда клиент получает запрос на проверку URL-адреса уведомления, клиент отвечает маркером проверки в виде обычного текста.

  4. Microsoft Graph проверяет ответ маркера проверки клиента и, если маркер проверки действителен, возвращает идентификатор подписки.

Запрос на подписку

Клиентское приложение отправляет запрос POST в конечную точку /subscriptions . В следующем примере показан базовый запрос на подписку на изменения в определенной почтовой папке от имени вошедшего пользователя. Дополнительные сведения о других ресурсах Microsoft Graph, поддерживающих уведомления об изменениях, см. в разделе Поддерживаемые ресурсы.

POST https://graph.microsoft.com/v1.0/subscriptions
Content-Type: application/json

{
  "changeType": "created,updated",
  "notificationUrl": "https://webhook.azurewebsites.net/notificationClient",
  "lifecycleNotificationUrl": "https://webhook.azurewebsites.net/api/lifecycleNotifications",
  "resource": "/me/mailfolders('inbox')/messages",
  "expirationDateTime": "2016-03-20T11:00:00.0000000Z",
  "clientState": "SecretClientState"
}

Свойство clientState является обязательным. Задание свойства позволяет службе подтвердить, что уведомления об изменениях, которые вы получаете, исходят от Microsoft Graph. По этой причине значение свойства должно оставаться секретным и быть известно только приложению и службе Microsoft Graph.

В случае успешного выполнения Microsoft Graph возвращает код 201 Created и объект подписки в теле отклика.

Каждая подписка имеет уникальный идентификатор подписки, даже если у вас есть несколько подписок, которые отслеживают один и тот же ресурс и используют один и тот же URL-адрес уведомления.

Примечание.

Любой параметр строки запроса, включенный в свойство notificationUrl , включается в HTTP-запрос POST при доставке уведомлений в службу.

Дублирование подписок запрещено. Если запрос подписки содержит те же значения для changeType и ресурса , что и существующая подписка, запрос завершается ошибкой с кодом 409 ConflictHTTP и сообщением Subscription Id <> already exists for the requested combinationоб ошибке .

Проверка notificationUrl

При отправке запроса на создание подписки для получения уведомлений об изменениях с помощью веб-перехватчиков служба подписки проверяет допустимость свойства notificationUrl в запросе подписки. Процесс проверки работает следующим образом:

Примечание.

Если вы также подписываетесь на уведомления жизненного цикла , служба подписки также проверяет жизненный циклNotificationUrl.

  1. При запросе подписки Microsoft Graph кодирует маркер проверки и включает его в запрос POST на URL-адрес уведомления, как показано ниже.

    Content-Type: text/plain; charset=utf-8
    POST https://{notificationUrl}?validationToken={opaqueTokenCreatedByMicrosoftGraph}
    
  2. Клиент должен правильно декодировать URL-адрес, чтобы получить маркер проверки обычного текста из Microsoft Graph.

    Рекомендуется избежать любого кода HTML или JavaScript, так как злоумышленники могут использовать конечную точку уведомления для типов атак с межсайтовых сценариев. Microsoft Graph никогда не отправляет значения, содержащие код HTML или JavaScript.

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

  3. Клиент должен ответить следующими характеристиками в течение 10 секунд после шага 1:

    • Код состояния HTTP 200 OK.
    • Тип контента text/plain.
    • Текст, содержащий маркер проверки простого текста с декодированием URL-адреса .

    Важно!

    Маркер проверки должен быть возвращен в виде обычного текста. Если клиент возвращает зашифрованный маркер проверки, проверка завершается ошибкой.

  4. Если проверка конечной точки завершается сбоем, Microsoft Graph не создает подписку.

Получение уведомлений

Хотя подписка действительна и есть изменения в ресурсе, на который вы подписаны POST , Microsoft Graph отправляет запрос на notificationUrl с подробными сведениями об изменениях. Эти полезные данные являются уведомлением об изменении.

Для большинства подписок Microsoft Graph не задерживает отправку уведомлений, но доставляет все уведомления в рамках соглашения об уровне обслуживания, если в службе не произошел инцидент.

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

Пример уведомления об изменениях

Когда пользователь получает сообщение электронной почты, Microsoft Graph отправляет объект уведомления об изменении в клиентское приложение, как показано в следующем примере. Сведения о полезных данных уведомления см. в разделе changeNotificationCollection и связанное с ним изменениеNotification .

При многочисленных изменениях Microsoft Graph может отправлять несколько уведомлений, соответствующих разным подпискам, в одном и том же запросе POST.

{
  "value": [
    {
      "id": "lsgTZMr9KwAAA",
      "subscriptionId":"{subscription_guid}",
      "subscriptionExpirationDateTime":"2016-03-19T22:11:09.952Z",
      "clientState":"secretClientValue",
      "changeType":"created",
      "resource":"users/{user_guid}@{tenant_guid}/messages/{long_id_string}",
      "tenantId": "84bd8158-6d4d-4958-8b9f-9d6445542f95",
      "resourceData":
      {
        "@odata.type":"#Microsoft.Graph.Message",
        "@odata.id":"Users/{user_guid}@{tenant_guid}/Messages/{long_id_string}",
        "@odata.etag":"W/\"CQAAABYAAADkrWGo7bouTKlsgTZMr9KwAAAUWRHf\"",
        "id":"{long_id_string}"
      }
    }
  ]
}

Обработка уведомлений об изменениях

При получении уведомления об изменении:

  1. Проверьте свойство clientState . Оно должно соответствовать значению, отправленному с запросом на создание подписки.

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

  2. Обновите клиентское приложение на основе бизнес-логики.

Жизненный цикл подписки

Если они больше не нужны, подписки могут быть удалены или истечет. При создании подписки вы задаете дату окончания срока действия с помощью свойства expirationDateTime . По истечении этого времени Microsoft Graph удаляет подписку и не отправляет уведомления в конечную точку. Вы также можете явно удалить подписку.

Самый простой способ продолжить получать уведомления — продолжить продление запроса на подписку. Каждое уведомление содержит свойство subscriptionExpirationDateTime . Вы можете использовать его, чтобы узнать, когда будет продлена подписка.

Каждая подписка также включает маркер доступа, предоставленный конечной точке. Срок действия этого маркера доступа может произойти до истечения срока действия подписки. Вы можете управлять истечением срока действия маркера доступа с помощью уведомлений о жизненном цикле подписки.

Продление подписки

PATCH https://graph.microsoft.com/v1.0/subscriptions/{id}
Content-Type: application/json

{
  "expirationDateTime": "2016-03-22T11:00:00.0000000Z"
}

Если запрос на продление подписки выполнен успешно, Microsoft Graph возвращает 200 OK код ответа и объект подписки в тексте ответа. Объект подписки включает новое значение expirationDateTime .

Удаление подписки

Если клиентскому приложению больше не нужны уведомления об изменениях, оно может удалить подписку с помощью идентификатора подписки следующим образом:

DELETE https://graph.microsoft.com/v1.0/subscriptions/{id}

В случае успешного выполнения Microsoft Graph возвращает код 204 No Content.

Уведомления жизненного цикла для подписки

Для повышения гибкости и надежности при создании подписки вы также можете подписаться на уведомления о жизненном цикле для этой подписки, предоставив конечную точку lifecycleNotificationUrl , которая получает, обрабатывает уведомления о жизненном цикле и реагирует на них.

При подписке на уведомления жизненного цикла Microsoft Graph оповещает вас:

  • Когда истекает срок действия маркера доступа.
  • Когда срок действия подписки истекает.
  • Когда администратор клиента отменяет разрешения приложения на чтение ресурса.

Примечание.

Если срок действия маркера доступа истек, уведомления не доставляются в конечную точку. Но Microsoft Graph продолжает повторять отправку каждого уведомления в течение 4 часов. Таким образом, если маркер доступа обновляется в течение 4 часов после истечения срока действия, неотправленные уведомления доставляются.

Дополнительные сведения об использовании уведомлений о жизненном цикле для подписки см. в разделе Уведомления о жизненном цикле.

Сводка

Из этой статьи вы узнали, как получать уведомления об изменениях с помощью веб-перехватчиков.

  1. Создайте подписку, отправив запрос POST в конечную точку /subscriptions .
  2. Microsoft Graph проверяет конечную точку уведомления веб-перехватчика перед завершением процесса создания подписки. С подпиской связан уникальный идентификатор подписки .
  3. Пока подписка по-прежнему действительна, а в ресурсе, на который подписана подписка, происходят изменения, Microsoft Graph отправляет уведомления об изменениях в конечную точку notificationUrl .
  4. Регулярно продлевать подписку, чтобы сохранить ее действительность и продолжать получать обновления об изменениях, на которые подписана подписка.