Compartir a través de


Recepción de notificaciones de cambios a través de webhooks

Un webhook es una API de devolución de llamada definida por el usuario basada en HTTP que puede configurar en la infraestructura para recibir notificaciones de cambios y eventos de un servicio, como Microsoft Graph. Para usar webhooks, debe definir un punto de conexión protegido con HTTPS accesible públicamente que recibirá las notificaciones.

Puede crear una suscripción al recurso para el que desea recibir una notificación de los cambios. Aunque la suscripción es válida, Microsoft Graph envía una notificación al punto de conexión cada vez que detecta un cambio en el recurso.

El artículo le guía por el proceso de implementación del punto de conexión de webhook, la suscripción y la administración de suscripciones de Microsoft Graph y cómo recibir notificaciones de cambios a través de webhooks.

Para obtener más información sobre cómo crear notificaciones de cambio, consulte Notificaciones de cambio de Microsoft Graph API.

Consideraciones para un punto de conexión de webhook

Para poder recibir una notificación a través de webhooks, debe crear un punto de conexión protegido con HTTPS accesible públicamente que se pueda direccionar a través de la dirección URL. Si el punto de conexión no es accesible públicamente, Microsoft Graph no enviará notificaciones al punto de conexión.

El punto de conexión debe proporcionar respuestas HTTP correctas, coherentes y oportunas para recibir notificaciones de forma confiable. Si un punto de conexión no responde de forma oportuna, es posible que el servicio de notificación de cambios empiece a quitar las notificaciones. Las notificaciones eliminadas no se pueden recuperar.

El punto de conexión también debe seguir autentificado en Microsoft Graph, ya sea renovando continuamente la suscripción o respondiendo a las notificaciones del ciclo de vida.

Códigos HTTP y lógica de reintento

Una vez que el servicio de notificaciones de cambios de Microsoft Graph recibe un código de clase 2xx del punto de conexión, la notificación se considera enviada. Siempre que el servicio de notificaciones de cambios reciba cualquier otra respuesta HTML (incluso un código de error) en 3 segundos, el servicio sigue intentando entregar la notificación durante un máximo de 4 horas.

  • Si puede procesar la notificación en una ventana de 3 segundos, debe devolver un 200 - OK código de estado a Microsoft Graph.
  • Si el servicio puede tardar más de 3 segundos en procesar la notificación, puede optar por conservar la notificación en una cola en el punto de conexión y devolver 202 - Accepted el código de estado a Microsoft Graph.
  • Si la notificación no se procesa ni se pone en cola, devuelve un código de clase 5xx para indicar un error para que Microsoft Graph pueda reintentar la notificación.

Las notificaciones que no se entreguen se reintentarán a intervalos de retroceso exponencial. Las notificaciones perdidas pueden tardar hasta 4 horas en volver a enviarse una vez que el punto de conexión se conecte.

Limitación

Por motivos de seguridad y rendimiento, Microsoft Graph limita las notificaciones enviadas a puntos de conexión que se vuelven lentas o no responden. Esto puede incluir la eliminación de notificaciones de forma que no se puedan recuperar.

  1. Un punto de conexión se marca como "lento" una vez que más del 10 % de las respuestas tardan más de 3 segundos en un período de 10 minutos.

    • Una vez que un punto de conexión se ha marcado como "lento", las nuevas notificaciones se enviarán con un retraso de 10 segundos.
    • Un punto de conexión sale del estado "lento" una vez que menos del 10 % de las respuestas tardan más de 3 segundos en una ventana de 10 minutos.
  2. Un punto de conexión se marca como "drop" una vez que más del 15 % de las respuestas tardan más de 3 segundos en una ventana de 10 minutos.

    • Una vez que un punto de conexión se ha marcado como "drop", se quitarán las nuevas notificaciones, durante un máximo de 10 minutos.
    • Un punto de conexión sale del estado "drop" una vez que menos del 15 % de las respuestas tardan más de 3 segundos en una ventana de 10 minutos.

Si el punto de conexión no puede cumplir estas características de rendimiento, considere la posibilidad de usar Event Hubs o Event Grid como destino para recibir notificaciones.

Autenticación

Al crear la suscripción, se envía un token de acceso al punto de conexión. Este token de acceso solo se usa para comprobar la validez del punto de conexión y tiene un ciclo de vida diferente al de la suscripción de notificación de cambios. Este token de acceso suele expirar en un plazo de 1 hora.

El punto de conexión debe estar preparado para volver a autenticarse periódicamente con Microsoft Graph para asegurarse de que Microsoft Graph puede seguir entregando notificaciones al punto de conexión.

Si expira un token de acceso, no se entregarán las notificaciones. Sin embargo, esto no desencadena el comportamiento de limitación de puntos de conexión y Microsoft Graph seguirá reintentar el envío de cada notificación durante un máximo de 4 horas. Por lo tanto, si el token de acceso se actualiza dentro de las 4 horas posteriores a la expiración, se entregarán notificaciones no enviadas.

Se recomienda agregar notificaciones de ciclo de vida a la suscripción para recibir advertencias sobre la expiración del token, de modo que pueda volver a autenticar el punto de conexión de forma oportuna.

Al renovar la suscripción, también se actualiza el token de acceso.

Configuración del firewall

Puede configurar el firewall que protege el punto de conexión para permitir conexiones entrantes solo desde Microsoft Graph, lo que reduce la exposición adicional a notificaciones de cambios no válidas. Para obtener una lista completa de las direcciones IP usadas por Microsoft Graph para entregar las notificaciones de cambios, consulte puntos de conexión de Office 365 adicionales.

Nota:

La lista de direcciones IP que se usan para entregas las notificaciones de cambios se puede actualizar en cualquier momento sin previo aviso.

Crear una suscripción

Importante

Se requieren varios pasos para asegurarse de que se establece y mantiene un canal de comunicación seguro entre el servicio de notificaciones de cambios de Microsoft Graph y el punto de conexión.

Para empezar a recibir notificaciones de cambio de Microsoft Graph, debe crear una suscripción mediante la dirección URL del punto de conexión (dirección URL de notificación) para establecer la suscripción. El patrón de establecimiento de una suscripción es el siguiente:

  1. La aplicación cliente envía una solicitud de suscripción para suscribirse a los cambios en un recurso específico.

  2. Microsoft Graph comprueba la solicitud.

    • Si la solicitud es válida, Microsoft Graph envía un token de validación a la dirección URL de notificación para que la aplicación cliente valide la dirección URL de notificación.
    • Si la solicitud no es válida, Microsoft Graph envía una respuesta de error con un código de error y detalles.
  3. Cuando el cliente recibe la solicitud de validación de la dirección URL de notificación, el cliente responde con el token de validación en texto sin formato.

  4. Microsoft Graph valida la respuesta del token de validación del cliente y, si el token de validación es válido, responde con un identificador de suscripción.

Solicitud de suscripción

La aplicación cliente envía una solicitud POST al punto de /subscriptions conexión. En el ejemplo siguiente se muestra una solicitud básica para suscribirse a los cambios en una carpeta de correo específica en nombre del usuario que ha iniciado sesión. Para obtener más información sobre otros recursos de Microsoft Graph que admiten notificaciones de cambios, consulte Recursos admitidos.

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

Se requiere la propiedad clientState . Al establecer esta propiedad, el servicio puede confirmar que las notificaciones de cambio que recibe se originan en Microsoft Graph. Por eso, el valor de la propiedad debe permanecer secreto y ser conocido solo por la aplicación y el servicio de Microsoft Graph.

Si se ejecuta correctamente, Microsoft Graph muestra un código 201 Created y un objeto subscription en el cuerpo.

Cada suscripción tiene un identificador de suscripción único, incluso si tiene varias suscripciones que supervisan el mismo recurso y usan la misma dirección URL de notificación.

Nota:

Cualquier parámetro de cadena de consulta incluido en la propiedad notificationUrl se incluye en la solicitud HTTP POST cuando se entregan notificaciones al servicio.

No se permiten suscripciones duplicadas. Cuando una solicitud de suscripción contiene los mismos valores para changeType y el recurso que una suscripción existente, se produce un error en la solicitud con un código 409 Conflictde error HTTP y el mensaje Subscription Id <> already exists for the requested combinationde error .

validación de notificationUrl

Al enviar una solicitud para crear una suscripción para obtener notificaciones de cambios a través de webhooks, el servicio de suscripción comprueba si la propiedad notificationUrl de la solicitud de suscripción es válida. El proceso de validación funciona de la siguiente manera:

Nota:

Si también se suscribe a las notificaciones de ciclo de vida , el servicio de suscripción también valida el lifecycleNotificationUrl.

  1. Cuando se solicita una suscripción, Microsoft Graph codifica un token de validación e lo incluye en una solicitud POST a la dirección URL de notificación como se indica a continuación.

    Content-Type: text/plain; charset=utf-8
    POST https://{notificationUrl}?validationToken={opaqueTokenCreatedByMicrosoftGraph}
    
  2. El cliente debe descodificar correctamente la dirección URL para obtener el token de validación de texto sin formato de Microsoft Graph.

    Escapar de cualquier CÓDIGO HTML o JavaScript es una buena práctica, ya que los actores malintencionados pueden usar el punto de conexión de notificación para el tipo de ataques de scripting entre sitios. Microsoft Graph nunca envía ningún valor que contenga código HTML o JavaScript.

    En general, trate el valor del token de validación como opaco, ya que el formato de token puede cambiar sin previo aviso.

  3. El cliente debe responder con las siguientes características en un plazo de 10 segundos desde el paso 1:

    • Un código de estado de HTTP 200 OK.
    • Un tipo de contenido de text/plain.
    • Cuerpo que incluye el token de validación de texto sin formato descodificado de dirección URL .

    Importante

    El token de validación debe devolverse en texto sin formato. Si el cliente devuelve un token de validación codificado, se producirá un error de validación.

  4. Si se produce un error en la validación del punto de conexión, Microsoft Graph no crea la suscripción.

Recibir notificaciones

Aunque la suscripción es válida y hay cambios en el recurso al que se suscribió, Microsoft Graph envía una POST solicitud a notificationUrl con detalles de los cambios. Esta carga es la notificación de cambio.

En la mayoría de las suscripciones, Microsoft Graph no retrasa el envío de notificaciones, sino que entrega todas las notificaciones dentro del Acuerdo de Nivel de Servicio a menos que el servicio experimente un incidente.

Una carga de notificación de cambio enviada al punto de conexión puede contener una colección de notificaciones de cambio relacionadas con las suscripciones.

Ejemplo de notificación de cambio

Cuando el usuario recibe un correo electrónico, Microsoft Graph envía un objeto de notificación de cambio a la aplicación cliente, como se muestra en el ejemplo siguiente. Vea changeNotificationCollection y el elemento changeNotification relacionado para obtener más información sobre la carga de la notificación.

Cuando se producen muchos cambios, es posible que Microsoft Graph envíe varias notificaciones que se corresponden con distintas suscripciones en la misma POST solicitud.

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

Procesar la notificación de cambios

Cuando reciba una notificación de cambio:

  1. Valide la propiedad clientState . Debe coincidir con el valor enviado originalmente con la solicitud de creación de suscripción.

    Si hay un error de coincidencia, no considere la notificación de cambio como válida. Es posible que la notificación de cambio no se haya originado en Microsoft Graph y que haya sido enviada por un actor no autorizado. También debe investigar de dónde proviene la notificación y tomar las medidas adecuadas.

  2. Actualice la aplicación cliente en función de la lógica de negocios.

Ciclo de vida de la suscripción

Cuando ya no se necesiten, las suscripciones pueden eliminarse o expirar. Al crear la suscripción, se establece una fecha de expiración mediante la propiedad expirationDateTime . Una vez transcurrido este tiempo, Microsoft Graph elimina la suscripción y no envía notificaciones al punto de conexión. También puede eliminar explícitamente la suscripción.

La manera más sencilla de seguir recibiendo notificaciones es continuar renovando la solicitud de suscripción. Cada notificación incluye una propiedad subscriptionExpirationDateTime . Puede usar esta opción para guiarle a la hora de renovar la suscripción.

Cada suscripción también incluye un token de acceso concedido al punto de conexión. La hora de expiración de este token de acceso puede producirse antes de la expiración de la suscripción. Puede administrar la expiración del token de acceso mediante las notificaciones de ciclo de vida de la suscripción.

Renovación de una suscripción

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

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

Si la solicitud de renovación de la suscripción se realiza correctamente, Microsoft Graph devuelve un 200 OK código de respuesta y un objeto de suscripción en el cuerpo de la respuesta. El objeto de suscripción incluye el nuevo valor expirationDateTime .

Eliminar una suscripción

Si la aplicación cliente ya no quiere notificaciones de cambio, puede eliminar la suscripción mediante su subscriptionId de la siguiente manera:

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

Si se ejecuta correctamente, Microsoft Graph devuelve un código 204 No Content.

Notificaciones de ciclo de vida de la suscripción

Para aumentar la flexibilidad y confiabilidad, al crear una suscripción, también puede suscribirse a las notificaciones de ciclo de vida de esa suscripción proporcionando un punto de conexión lifecycleNotificationUrl que recibirá, procesará y responderá a las notificaciones del ciclo de vida.

Al suscribirse a las notificaciones de ciclo de vida, Microsoft Graph le avisa de lo siguiente:

  • Cuando el token de acceso está a punto de expirar.
  • Cuando una suscripción está a punto de expirar.
  • Cuando un administrador de inquilinos ha revocado los permisos de la aplicación para leer un recurso.

Nota:

Si expira un token de acceso, las notificaciones no se entregarán en el punto de conexión. Pero Microsoft Graph seguirá reintentar el envío de cada notificación durante un máximo de 4 horas. Por lo tanto, si el token de acceso se actualiza dentro de las 4 horas posteriores a la expiración, se entregarán notificaciones no enviadas.

Para obtener más información sobre cómo usar las notificaciones de ciclo de vida de la suscripción, consulte Notificaciones de ciclo de vida.

Resumen

En este artículo, ha aprendido a recibir notificaciones de cambios a través de webhooks.

  1. Cree una suscripción mediante el envío de una solicitud POST al punto de /subscriptions conexión.
  2. Microsoft Graph validará el punto de conexión de notificación de webhook antes de completar el proceso de creación de la suscripción. Un valor de subscriptionId único está vinculado a la suscripción.
  3. Siempre que la suscripción siga siendo válida y se produzcan cambios en el recurso suscrito, Microsoft Graph enviará notificaciones de cambio al punto de conexión notificationUrl .
  4. Renueve periódicamente la suscripción para mantener su validez y seguir recibiendo actualizaciones sobre los cambios suscritos.