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 reciba 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 Microsoft Graph API notificaciones de cambios.
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 envía 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 10 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 10 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 entregan se reintenten a intervalos de retroceso exponenciales. 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. Puede incluir la eliminación de notificaciones de forma que no se puedan recuperar.
Un punto de conexión se marca como "lento" una vez que más del 10 % de las respuestas tardan más de 10 segundos en un período de 10 minutos.
- Una vez que un punto de conexión se marca como "lento", las nuevas notificaciones se envían 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 10 segundos en un período de 10 minutos.
Un punto de conexión se marca como "drop" una vez que más del 15 % de las respuestas tardan más de 10 segundos en una ventana de 10 minutos.
- Una vez que un punto de conexión está marcado como "drop", se quitan 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 10 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 que Microsoft Graph vuelva a autorizarlo periódicamente para asegurarse de que Microsoft Graph puede seguir entregando notificaciones al punto de conexión.
Si expira un token de acceso, las notificaciones no se entregan. Sin embargo, no desencadena el comportamiento de limitación de puntos de conexión y Microsoft Graph sigue 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 en un plazo de 4 horas después de la expiración, se entregan notificaciones no enviadas.
Se recomienda agregar notificaciones de ciclo de vida a la suscripción para recibir una advertencia sobre la expiración del token, de modo que pueda volver a autorizar 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:
La aplicación cliente envía una solicitud de suscripción para suscribirse a los cambios en un recurso específico.
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.
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.
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 . Establecer la propiedad permite que el servicio confirme 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 Conflict
de error HTTP y el mensaje Subscription Id <> already exists for the requested combination
de 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.
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}
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.
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.
- Un código de estado de
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:
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 origine 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.
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 usarlo 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 recibe, procesa y responde 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 revoca los permisos de la aplicación para leer un recurso.
Nota:
Si expira un token de acceso, las notificaciones no se entregan al punto de conexión. Pero Microsoft Graph sigue 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 en un plazo de 4 horas después de la expiración, se entregan 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.
- Cree una suscripción mediante el envío de una solicitud POST al punto de
/subscriptions
conexión. - Microsoft Graph valida el punto de conexión de notificación de webhook antes de completar el proceso de creación de la suscripción. Un identificador de suscripción único está vinculado a la suscripción.
- Siempre que la suscripción siga siendo válida y se produzcan cambios en el recurso suscrito, Microsoft Graph envía notificaciones de cambio al punto de conexión notificationUrl .
- Renueve periódicamente la suscripción para mantener su validez y seguir recibiendo actualizaciones sobre los cambios suscritos.