Поделиться через


Уменьшение количества пропущенных уведомлений о подписках и изменениях

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

Существует три типа уведомлений о жизненном цикле:

  • reauthorizationRequired notifications
  • Уведомления об удалении подписки
  • пропущенные уведомления

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

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

Поддерживаемые ресурсы

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

Настройка подписки для получения уведомлений о жизненном цикле

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

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

{
  "changeType": "created,updated",
  "notificationUrl": "https://webhook.azurewebsites.net/api/resourceNotifications",
  "lifecycleNotificationUrl": "https://webhook.azurewebsites.net/api/lifecycleNotifications",
  "resource": "/users/{id}/messages",
  "expirationDateTime": "2020-03-20T11:00:00.0000000Z",
  "clientState": "<secretClientState>"
}

Конечная точка lifecycleNotificationUrl может совпадать с notificationUrl.

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

При использовании канала доставки веб-перехватчиков необходимо проверить конечные точки lifecycleNotificationUrl и notificationUrl.

Структура уведомления жизненного цикла

Полезные данные уведомления о жизненном цикле соответствуют структуре объекта changeNotificationCollection и связанного объекта changeNotification следующим образом:

{
  "value": [
    {
      "subscriptionId":"<subscription_guid>",
      "subscriptionExpirationDateTime":"2019-03-20T11:00:00.0000000Z",
      "tenantId": "<tenant_guid>",
      "clientState":"<secretClientState>",
      "lifecycleEvent": "subscriptionRemoved or missed or reauthorizationRequired"
    }
  ]
}

Где жизненный циклEvent может быть subscriptionRemoved, missedили reauthorizationRequired, представляющий типы уведомлений о жизненном цикле.

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

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

reauthorizationRequired notifications

reauthorizationRequired События жизненного цикла оповещают вас, когда Microsoft Graph требует от приложения повторной проверки подлинности подписки, например в следующих случаях:

Перед выполнением любого из этих условий Microsoft Graph отправляет запрос авторизации в lifecycleNotificationUrl.

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

    //The following code is for illustrative purposes only
    var TokenTimeToExpirationInMinutes=(TokenExpirationTime-CurrentTime)/4;

    if((TokenTimeToExpirationInMinutes)<=180 && TokenTimeToExpirationInMinutes>60){
        //Microsoft Graph will send reauthorizationRequired notification
        TokenTimeToExpirationInMinutes=TokenTimeToExpirationInMinutes/2;
    }
    elseif(TokenTimeToExpirationInMinutes<60 && TokenTimeToExpirationInMinutes>=0){
            //Microsoft Graph will send reauthorizationRequired notification every 15 mins
            TokenTimeToExpirationInMinutes=TokenTimeToExpirationInMinutes-15;
    } else {
      //Microsoft Graph will stop sending reauthorizationRequired notifications
    }

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

  1. Microsoft Graph требует повторной авторизации подписки.

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

  2. Microsoft Graph отправляет уведомление о запросе авторизации в lifecycleNotificationUrl

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

Реагирование на уведомления reauthorizationRequired

  1. Подтвердите получение уведомления о жизненном цикле, ответив на вызов POST с 202 - Accepted кодом ответа.

  2. Проверьте подлинность уведомления жизненного цикла.

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

  4. Вызовите один из двух следующих API. Если вызов API выполняется успешно, поток уведомлений об изменениях возобновляется.

    • /reauthorize Вызовите действие, чтобы повторно авторизовать подписку без продления срока ее действия.

      POST  https://graph.microsoft.com/v1.0/subscriptions/{id}/reauthorize
      
    • Выполните операцию обновления для одновременной повторной проверки подлинности и продления подписки.

      PATCH https://graph.microsoft.com/v1.0/subscriptions/{id}
      Content-Type: application/json
      
      {
         "expirationDateTime": "2019-09-21T11:00:00.0000000Z"
      }
      

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

      Вы может повторить эти действия позднее в любое время и успешно выполнить их, если изменяются условия доступа.

Дополнительные сведения

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

  • Частота запросов авторизации может изменяться.

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

подписка Удалены уведомления

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

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

В следующем потоке показан поток события subscriptionRemoved :

  1. Служба определяет, что подписка должна быть удалена из Microsoft Graph.

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

  2. Microsoft Graph отправляет уведомление жизненного цикла subscriptionRemoved для lifecycleNotificationUrl (если указано).

    Уведомления о жизненном цикле не доступны с момента subscriptionRemoved отправки уведомления о жизненном цикле, когда приложение успешно воссоздает подписку. Приложение должно получить эти изменения самостоятельно.

Ответ на уведомления subscriptionRemoved

  1. Подтвердите получение уведомления о жизненном цикле, ответив на вызов POST с 202 - Accepted кодом ответа.

  2. Проверьте подлинность уведомления жизненного цикла.

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

  4. Создайте подписку.

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

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

пропущенные уведомления

missed События жизненного цикла предупреждают вас о том, что некоторые уведомления об изменениях не были доставлены. Например, из-за регулирования.

Реагирование на пропущенные уведомления

  1. Подтвердите получение уведомления о жизненном цикле, ответив на вызов POST с 202 - Accepted кодом ответа.
  2. Проверьте подлинность уведомления жизненного цикла.
  3. Выполните полную повторную синхронизацию данных ресурса, чтобы определить изменения, которые не были доставлены в виде уведомлений; например, с помощью разностного запроса.