Receber notificações de alteração por meio de webhooks

Um webhook é uma API de retorno de chamada definida pelo usuário baseada em HTTP que você pode configurar em sua infraestrutura para receber notificações de alterações e eventos de um serviço, como o Microsoft Graph. Para usar webhooks, você precisa definir um ponto de extremidade protegido por HTTPS de acesso público que receberá as notificações.

Você pode criar uma assinatura para o recurso para o qual deseja ser notificado sobre as alterações. Embora a assinatura seja válida, o Microsoft Graph envia uma notificação ao ponto de extremidade sempre que detecta uma alteração no recurso.

O artigo orienta você no processo de implementar seu ponto de extremidade do webhook, assinar e gerenciar assinaturas do Microsoft Graph e como receber notificações de alteração por meio de webhooks.

Para obter detalhes sobre como criar notificações de alteração, consulte Microsoft API do Graph notificações de alteração.

Considerações sobre um ponto de extremidade webhook

Antes de receber uma notificação por meio de webhooks, você deve criar um ponto de extremidade protegido por HTTPS acessível publicamente que seja endereçável via URL. Se o ponto de extremidade não estiver acessível publicamente, o Microsoft Graph não enviará notificações para o ponto de extremidade.

Seu ponto de extremidade deve fornecer respostas HTTP corretas, consistentes e oportunas para receber notificações de forma confiável. Se um ponto de extremidade não responder em tempo hábil, o serviço de notificação de alteração poderá começar a soltar notificações. As notificações descartadas não podem ser recuperadas.

Seu ponto de extremidade também deve continuar autenticado no Microsoft Graph, renovando continuamente sua assinatura ou respondendo às notificações do ciclo de vida.

Códigos HTTP e lógica de repetição

Depois que o serviço de notificações de alteração do Microsoft Graph recebe um código de classe 2xx do ponto de extremidade, a notificação é considerada enviada. Desde que o serviço de notificações de alteração receba qualquer outra resposta HTML (até mesmo um código de erro) dentro de 3 segundos, o serviço continua tentando entregar a notificação por até 4 horas.

  • Se você conseguir processar a notificação em uma janela de 3 segundos, deverá retornar um 200 - OK código status para o Microsoft Graph
  • Se o serviço levar mais de três segundos para processar a notificação, você poderá optar por persistir a notificação em uma fila no ponto de extremidade e retornar 202 - Accepted status código para o Microsoft Graph.
  • Se a notificação não for processada ou enfileirada, retorne um código de classe 5xx para indicar um erro para que o Microsoft Graph possa repetir a notificação.

As notificações que não forem entregues serão repetidas em intervalos de backoff exponencial. As notificações perdidas podem levar até 4 horas para serem reenviadas quando o ponto de extremidade estiver online.

Limitação

Por motivos de segurança e desempenho, o Microsoft Graph limita as notificações enviadas a pontos de extremidade que ficam lentos ou sem resposta. Isso pode incluir a remoção de notificações de uma forma que não possam ser recuperadas.

  1. Um ponto de extremidade é marcado como "lento" uma vez que mais de 10% das respostas levam mais de 3 segundos em uma janela de 10 minutos.

    • Depois que um ponto de extremidade tiver sido marcado como "lento", as novas notificações serão enviadas com um atraso de 10 segundos.
    • Um ponto de extremidade sai do estado "lento" uma vez que menos de 10% das respostas levam mais de 3 segundos em uma janela de 10 minutos.
  2. Um ponto de extremidade é marcado como "drop" uma vez que mais de 15% das respostas levam mais de 3 segundos em uma janela de 10 minutos.

    • Depois que um ponto de extremidade tiver sido marcado como "suspenso", as novas notificações serão descartadas por até 10 minutos
    • Um ponto de extremidade sai do estado "drop" uma vez que menos de 15% das respostas levam mais de 3 segundos em uma janela de 10 minutos.

Se o ponto de extremidade não conseguir atender a essas características de desempenho, considere usar Hubs de Eventos ou Grade de Eventos como um destino para receber notificações.

Autenticação

Quando você cria sua assinatura, um token de acesso é enviado para o ponto de extremidade. Esse token de acesso é usado apenas para marcar a validade do ponto de extremidade e tem um ciclo de vida diferente da assinatura de notificação de alteração. Esse token de acesso geralmente expira dentro de uma hora.

Seu ponto de extremidade deve estar preparado para reautorizar regularmente com o Microsoft Graph para garantir que o Microsoft Graph possa continuar a fornecer notificações ao seu ponto de extremidade.

Se um token de acesso expirar, as notificações não serão entregues. No entanto, isso não dispara o comportamento de limitação do ponto de extremidade e o Microsoft Graph continuará a tentar novamente enviar cada notificação por até 4 horas. Portanto, se o token de acesso for atualizado dentro de 4 horas após a expiração, notificaçõesnãos serão entregues.

É recomendável adicionar notificações de ciclo de vida à sua assinatura para receber aviso sobre a expiração do token para que você possa reautorizar seu ponto de extremidade em tempo hábil.

Quando você renova sua assinatura, seu token de acesso também é atualizado.

Configuração do firewall

Você pode configurar o firewall que protege seu ponto de extremidade para permitir conexões de entrada somente do Microsoft Graph, reduzindo a exposição a notificações de alteração inválidas. Para obter uma lista completa de endereços IP usados pelo Microsoft Graph para oferecer notificações de alteração, confira pontos de extremidade adicionais para Microsoft 365.

Observação

Os endereços IP listados que são usados para fornecer notificações de alteração podem ser atualizados a qualquer momento sem aviso prévio.

Criar uma assinatura

Importante

Várias etapas são necessárias para garantir que um canal de comunicação seguro seja estabelecido e mantido entre o serviço de notificações de alteração do Microsoft Graph e seu ponto de extremidade.

Para começar a receber notificações de alteração do Microsoft Graph, você deve criar uma assinatura usando a URL do ponto de extremidade (URL de notificação) para estabelecer a assinatura. O padrão de estabelecimento de uma assinatura é o seguinte:

  1. O aplicativo cliente envia uma solicitação de assinatura para assinar alterações em um recurso específico.

  2. O Microsoft Graph verifica a solicitação.

    • Se a solicitação for válida, o Microsoft Graph enviará um token de validação para a URL de notificação do aplicativo cliente para validar a URL de notificação.
    • Se a solicitação for inválida, o Microsoft Graph enviará uma resposta de erro com um código de erro e detalhes.
  3. Quando o cliente recebe a solicitação de validação de URL de notificação, o cliente responde com o token de validação em texto simples.

  4. O Microsoft Graph valida a resposta do token de validação do cliente e, se o token de validação for válido, responderá com uma ID de assinatura.

Solicitação de assinatura

O aplicativo cliente envia uma solicitação POST para o /subscriptions ponto de extremidade. O exemplo a seguir mostra uma solicitação básica para assinar alterações em uma pasta de email específica em nome do usuário conectado. Para obter mais informações sobre outros recursos do Microsoft Graph que dão suporte a notificações de alteração, consulte recursos com suporte.

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"
}

A propriedade clientState é necessária. Definir essa propriedade permite que seu serviço confirme que as notificações de alteração recebidas são originadas do Microsoft Graph. Por esse motivo, o valor da propriedade deve continuar em segredo e deve ser conhecido somente por seu aplicativo e pelo serviço do Microsoft Graph.

Se tiver êxito, o Microsoft Graph retornará um código 201 Created e um objeto subscription no corpo.

Cada assinatura tem uma assinatura exclusivaId, mesmo que você tenha várias assinaturas que monitoram o mesmo recurso e usem a mesma URL de notificação.

Observação

Qualquer parâmetro de cadeia de caracteres de consulta incluído na propriedade notificationUrl será incluído na solicitação HTTP POST quando as notificações estiverem sendo entregues ao seu serviço.

Observação

Assinaturas duplicadas não são permitidas. Quando uma solicitação de assinatura contém os mesmos valores para changeType e recurso que uma assinatura existente, a solicitação falha com um código 409 Conflictde erro HTTP e a mensagem Subscription Id <> already exists for the requested combinationde erro .

validação notificationUrl

Quando você envia uma solicitação para criar uma assinatura para obter notificações de alteração por meio de webhooks, o Microsoft Graph verifica se a propriedade notificationUrl em sua solicitação de assinatura é válida. O processo de validação funciona da seguinte maneira:

Observação

Se você também estiver assinando notificações do ciclo de vida , o Microsoft Graph também validará o ciclo de vidaNotificationUrl.

  1. Quando uma assinatura é solicitada, o Microsoft Graph codifica um token de validação e o inclui em uma solicitação POST para a URL de notificação da seguinte maneira.

    Content-Type: text/plain; charset=utf-8
    POST https://{notificationUrl}?validationToken={opaqueTokenCreatedByMicrosoftGraph}
    
  2. O cliente deve decodificar corretamente a URL para obter o token de validação de texto simples do Microsoft Graph.

    Escapar de qualquer HTML ou JavaScript é uma boa prática porque atores mal-intencionados podem usar o ponto de extremidade de notificação para tipos de ataques de script entre sites. O Microsoft Graph nunca envia nenhum valor contendo código HTML ou JavaScript.

    Em geral, trate o valor do token de validação como opaco, pois o formato de token pode ser alterado sem aviso prévio.

  3. O cliente deve responder com as seguintes características dentro de 10 segundos da etapa 1:

    • Um código de status de HTTP 200 OK.
    • Um tipo de conteúdo de text/plain.
    • Um corpo que inclui o token de validação de texto simples decodificado por URL .

    Importante

    O token de validação deve ser retornado em texto sem formatação. Se o cliente retornar um token de validação codificado, a validação falhará.

  4. Se a validação do ponto de extremidade falhar, o Microsoft Graph não criará a assinatura.

Receber notificações

Embora a assinatura seja válida e haja alterações no recurso ao qual você assinou, o Microsoft Graph envia uma POST solicitação para a notificaçãoUrl com detalhes das alterações. Essa carga é a notificação de alteração.

Para a maioria das assinaturas, o Microsoft Graph não atrasa o envio de notificações, mas fornece todas as notificações no SLA, a menos que o serviço esteja enfrentando um incidente.

Uma carga de notificação de alteração enviada ao ponto de extremidade pode conter uma coleção de notificações de alteração relacionadas às suas assinaturas.

Exemplo de notificação de alteração

Quando o usuário recebe um email, o Microsoft Graph envia um objeto de notificação de alteração para o aplicativo cliente, conforme mostrado no exemplo a seguir. Consulte changeNotificationCollection e a alteração relacionadaNotificação para obter detalhes da carga de notificação.

Quando várias alterações ocorrerem, o Microsoft Graph poderá enviar várias notificações que correspondam a diferentes assinaturas na mesma solicitação 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}"
      }
    }
  ]
}

Processar a notificação de alteração

Quando você recebe uma notificação de alteração:

  1. Valide a propriedade clientState . Ela deve corresponder ao valor enviado originalmente com a solicitação de criação da assinatura.

    Se houver uma incompatibilidade, não considere a notificação de alteração como válida. É possível que a notificação de alteração não tenha se originado do Microsoft Graph e possa ter sido enviada por um ator desonesto. Você também deve investigar de onde vem a notificação de alteração e tomar as medidas apropriadas.

  2. Atualize seu aplicativo cliente com base na lógica de negócios.

Ciclo de vida da assinatura

Quando elas não são mais necessárias, as assinaturas podem ser excluídas ou expirar. Ao criar sua assinatura, você define uma data de validade usando a propriedade expirationDateTime . Depois que esse tempo for passado, o Microsoft Graph excluirá a assinatura e não enviará notificações para o ponto de extremidade. Você também pode excluir explicitamente sua assinatura.

A maneira mais simples de continuar recebendo notificações é continuar renovando sua solicitação de assinatura. Cada notificação inclui uma propriedade subscriptionExpirationDateTime . Você pode usá-lo para orientar quando renovar sua assinatura.

Cada assinatura também inclui um token de acesso concedido ao ponto de extremidade. O tempo de validade desse token de acesso pode ocorrer antes da expiração da assinatura. Você pode gerenciar a expiração do token de acesso usando notificações de ciclo de vida para sua assinatura.

Renovar uma assinatura

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

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

Se a solicitação de renovação de assinatura for bem-sucedida, o Microsoft Graph retornará um 200 OK código de resposta e um objeto de assinatura no corpo da resposta. O objeto de assinatura inclui o novo valor expirationDateTime .

Excluir uma assinatura

Se o aplicativo cliente não quiser mais notificações de alteração, ele poderá excluir a assinatura usando sua assinaturaId da seguinte maneira:

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

Se tiver êxito, o Microsoft Graph retornará um código 204 No Content.

Notificações de ciclo de vida para sua assinatura

Para aumentar a flexibilidade e a confiabilidade, ao criar uma assinatura, você também pode assinar as notificações do ciclo de vida dessa assinatura fornecendo um ponto de extremidade lifecycleNotificationUrl que receberá, processará e responderá às notificações do ciclo de vida.

Ao assinar notificações de ciclo de vida, o Microsoft Graph alerta:

  • Quando o token de acesso está prestes a expirar.
  • Quando uma assinatura está prestes a expirar.
  • Quando um administrador de locatário revogou as permissões do aplicativo para ler um recurso.

Observação

Se um token de acesso expirar, as notificações não serão entregues no ponto de extremidade. Mas o Microsoft Graph continuará tentando enviar novamente cada notificação por até 4 horas. Portanto, se o token de acesso for atualizado dentro de 4 horas após a expiração, notificaçõesnãos serão entregues.

Para obter mais informações sobre como utilizar notificações de ciclo de vida para sua assinatura, confira notificações do ciclo de vida.

Resumo

Neste artigo, você aprendeu a receber notificações de alteração por meio de webhooks.

  1. Crie uma assinatura enviando uma solicitação POST para o /subscriptions ponto de extremidade.
  2. O Microsoft Graph validará o ponto de extremidade de notificação do webhook antes de concluir o processo de criação da assinatura. Uma assinatura exclusivaId está vinculada à assinatura.
  3. Enquanto a assinatura ainda for válida e ocorrerem alterações no recurso inscrito, o Microsoft Graph enviará notificações de alteração para o ponto de extremidade notificationUrl .
  4. Renove regularmente a assinatura para manter sua validade e continuar recebendo atualizações sobre as alterações inscritas.