Webhooks de V4

¿Qué es un webhook?

Un webhook es una devolución de llamada HTTP de tipo push que Frame.io activa en cuanto ocurre algo relevante en la cuenta (por ejemplo, cuando termina de transcodificarse un archivo nuevo, se añade un comentario o se crea un proyecto).

En lugar de sondear la API, proporcione una URL HTTPS pública. Frame.io envía una carga útil JSON a esa URL en tiempo real para que pueda:

Sincronizar metadatos con un DAM/MAM externo.
Rellenar canales de Slack o sistemas de tickets.

Para obtener más información sobre qué es un webhook y qué hace, consulte https://docs.webhook.site/.

Información general del punto final

OperaciónPunto finalDetalles
Crear un webhookPOST /v4/accounts/{account_id}/workspaces/{workspace_id}/webhooksCuerpo con name, url y events[]
Enumerar todos los webhooks de un espacio de trabajoGET /v4/accounts/{account_id}/workspaces/{workspace_id}/webhooksAdmite paginación
Mostrar un webhookGET /v4/webhooks/{webhook_id}Devuelve el secreto de firma solo en el momento de la creación
Actualizar un webhookPATCH /v4/webhooks/{webhook_id}Cambia url, events o is_active
Eliminar un webhookDELETE /v4/webhooks/{webhook_id}Detiene inmediatamente las entregas

Autenticación: Todos los puntos finales V4 requieren un token de acceso OAuth 2.0 obtenido mediante Adobe Developer Console. No se aceptan tokens de desarrollador heredados ni JWT.

Cambios y actualizaciones en Frame V4

Los webhooks creados en la versión heredada se transfieren a V4 con los siguientes cambios:

  1. Estructura de la carga útil: Se ha añadido el ID de Account a la carga útil
  2. Cambios en el punto final: team_id ya no se proporciona en la carga útil JSON, sino en el parámetro de ruta de la URL: https://api.frame.io/v4/accounts/:account_id/workspaces/:workspace_id/webhooks
  3. Integración de API: Debido a los cambios en la estructura de la API, los puntos finales y los métodos de autenticación, es necesario actualizar cualquier código existente de webhooks entrantes que realice llamadas posteriores a la API de Frame.io para enriquecer recursos o buscarlos
  4. Tipos de evento: Los webhooks de Assets se han dividido en eventos independientes de Files y Folders. Cualquier webhook procedente de la versión heredada con eventos de Assets debe actualizarse para incluir los eventos de Files y Folders correspondientes

Estado del webhook después de la migración: Cuando la cuenta migra a Frame.io V4, los webhooks existentes de versiones anteriores se desactivan automáticamente. Esto garantiza que pueda modificar los puntos finales de webhook y la lógica de integración para que funcionen con las actualizaciones de V4 antes de volver a activarlos. Los webhooks que no se hayan actualizado para ser compatibles con V4 encontrarán errores si se activan sin las modificaciones adecuadas. Puede comprobar qué webhooks están inactivos examinando el campo is_active mediante la API o revisando la configuración de webhooks antes de volver a activarlos.

Suscripciones a eventos de webhook

Al crear y actualizar webhooks, identifique qué eventos le interesan. Elija tantos como quiera, o solo unos pocos. Tenga en cuenta que la experiencia mejora si se suscribe a menos eventos y divide los webhooks de forma lógica con distintos esquemas de nomenclatura y distintos puntos finales. De este modo, podrá modelar la lógica empresarial en el punto final receptor para reducir el filtrado y el enrutamiento en funciones compartidas.

Ámbito de eventos: todos los eventos tienen como ámbito el Workspace proporcionado durante la creación del webhook. Esto significa que se enviarán eventos para las acciones realizadas en todos los proyectos de ese Workspace.

Proyectos

EventoDescripción
project.createdSe ha creado un nuevo Project
project.updatedSe ha actualizado la configuración de un Project
project.deletedSe ha eliminado un Project

Archivos

EventoDescripción
file.createdSe ha creado un File en Frame.io. Nota: Esto se activa antes de que el archivo termine de cargarse. Si el controlador necesita el archivo completo, recomendamos escuchar el evento upload.completed en su lugar
file.readyTodas las transcodificaciones han finalizado después de que un archivo se haya cargado y procesado
file.updatedHa cambiado el nombre u otra información de un File
file.deletedSe ha eliminado un File, manualmente o de otro modo
file.upload.completedSe ha cargado un File
file.versionedSe ha creado una versión de File

Carpetas

EventoDescripción
folder.createdSe ha creado una nueva Folder
folder.updatedSe ha actualizado la configuración de una Folder
folder.deletedSe ha eliminado una Folder

Comentarios

EventoDescripción
comment.createdSe ha creado un nuevo comentario o una nueva respuesta
comment.updatedSe ha actualizado un comentario
comment.deletedSe ha eliminado un comentario
comment.completedSe ha marcado un comentario como completado
comment.uncompletedSe ha marcado un comentario como no completado

Metadatos

EventoDescripción
metadata.value.updatedCampos de metadatos actualizados para un activo

Colecciones

EventoDescripción
collection.createdSe ha creado una nueva Collection
collection.updatedSe ha actualizado una Collection
collection.deletedSe ha eliminado una Collection

Campos personalizados

EventoDescripción
customfield.createdSe ha creado un nuevo campo personalizado
customfield.updatedSe ha actualizado un campo personalizado
customfield.deletedSe ha eliminado un campo personalizado

Usos compartidos

EventoDescripción
share.createdSe ha creado un nuevo Share
share.updatedSe ha actualizado un Share
share.deletedSe ha eliminado un Share
share.viewedSe ha visualizado un Share

Carga útil de mensajes de webhook

Todas las cargas útiles de webhook contienen un campo type, que indica el evento que se ha producido, y un objeto resource. El objeto resource contiene el tipo y el ID del recurso de Frame.io relacionado con el evento.

Ejemplo de carga útil

1{
2 "account": {
3 "id": "6f70f1bd-7e89-4a7e-b4d3-7e576585a181"
4 },
5 "project": {
6 "id": "7e46e495-4444-4555-8649-bee4d391a997"
7 },
8 "resource": {
9 "id": "d3075547-4e64-45f0-ad12-d075660eddd2",
10 "type": "file"
11 },
12 "type": "file.ready",
13 "user": {
14 "id": "56556a3f-859f-4b38-b6c6-e8625b5da8a5"
15 },
16 "workspace": {
17 "id": "378fcbf7-6f88-4224-8139-6a743ed940b2"
18 }
19}

En el ejemplo anterior de un evento file.created, resource.id indica el ID del File recién creado. Además, se incluyen los objetos workspace, project y user, que contienen los valores relacionados workspace.id, project.id y user.id. Estos valores se pueden usar para reducir las llamadas de API mediante el filtrado de eventos entrantes o la búsqueda local de datos almacenados en caché.

No incluimos información adicional sobre el recurso suscrito aparte del ID del recurso.

Si la aplicación requiere información o contexto adicional, recomendamos realizar una llamada de API para buscar más información sobre los recursos a los que se hace referencia.

Seguridad

De forma predeterminada, todos los webhooks tienen una clave de firma. Este secreto de firma no configurable se puede usar para verificar que la solicitud procede de Frame.io.

La carga útil de respuesta del webhook configurado incluye el secreto de firma específico de este webhook. Este secreto solo se proporciona en la respuesta inicial de creación del webhook, así que almacénelo en un lugar seguro, como el almacenamiento de secretos o las variables de entorno. Úselo más adelante para verificar que el webhook procede directamente de nuestros servidores y que no se ha interceptado ni manipulado de ningún modo.

Verificación de firmas de webhook

Para proteger una integración contra ataques de intermediario y de repetición, es esencial verificar la firma de la carga útil del webhook. La verificación garantiza que las cargas útiles de webhook las haya enviado realmente Frame.io y que el contenido no se haya modificado durante el transporte.

La solicitud POST incluye los siguientes encabezados HTTP:

Nombre de encabezadoDescripciónEjemplo
X-Frameio-Request-TimestampMarca de tiempo en que se envió la solicitud1604004499
X-Frameio-SignatureFirma de webhook calculadav0=a77ce6856e609c884575c2fd211d07a9ad1c3f72e19c06ff710e8f086ffca883
user-agent: "Frame.io V4 API"Agente de usuario en el encabezado de V4
user-agent: "Frame.io Legacy API"Agente de usuario en el encabezado de la API heredada
Python
1import hmac
2import hashlib
3
4def verify_signature(curr_time, req_time, signature, body, secret):
5 """
6 Verify Webhook signature
7 :Args:
8 curr_time (float): Current epoch time
9 req_time (float): Request epoch time
10 signature (str): Signature provided by the Frame.io API for the given request
11 body (str): Webhook body from the received POST
12 secret (str): The secret for this Webhook that you saved when you first created it
13 """
14 if int(curr_time) - int(req_time) < 500:
15 message = 'v0:{}:{}'.format(req_time, body)
16 calculated_signature = 'v0={}'.format(hmac.new(
17 bytes(secret, 'latin-1'),
18 msg=bytes(message, 'latin-1'),
19 digestmod=hashlib.sha256).hexdigest())
20 if calculated_signature == signature:
21 return True
22 return False

La marca de tiempo es la hora del sistema de Frame.io cuando se envía el webhook saliente. Puede usarse para evitar ataques de reproducción. Recomendamos verificar que esta hora esté dentro de un intervalo de 5 minutos con respecto a la hora local. La firma es un hash HMAC SHA-256 que usa la clave de firma proporcionada al crear el Webhook por primera vez. Siga estos pasos para verificar la firma:

1

Extracción de la firma

Extraiga la firma de los encabezados HTTP.

2

Creación del mensaje que se va a firmar

Cree un mensaje para firmarlo combinando la versión, la hora de entrega y el cuerpo de la solicitud: v0:timestamp:body.

3

Cálculo de HMAC SHA-256

Calcule la firma HMAC SHA-256 con el secreto de firma.

4

Comparación de firmas

Compare la firma calculada con la firma proporcionada.

La firma proporcionada lleva el prefijo v0=. Actualmente, Frame.io solo tiene esta versión para firmar solicitudes. Asegúrese de añadir este prefijo al principio de la firma calculada.

Reintentos y registro

Política de reintentos
  • Cinco intentos en total (el inicial y 4 reintentos)

  • Espera exponencial que comienza en 15 s, con variación aleatoria

  • Un estado que no sea 2xx o un tiempo de espera superior a 5 segundos activan el reintento

Registro de errores

Frame.io conserva un registro de errores con webhook_id, account_id, event_type, resource_id y user_id.

Tutorial de webhooks

Paso 1: Configuración del punto final receptor (se hace en primer lugar para saber cuál será la URL)

Aquí usamos webhook.site, que permite crear fácilmente un receptor de webhook de un solo uso para inspeccionar cargas útiles y enviar respuestas básicas sin ninguna lógica empresarial real. Al acceder por primera vez a https://webhook.site, se crea un punto final de webhook único que puede copiar de inmediato para usarlo.

Esta URL es exclusiva de la sesión.

Ejemplo del paso 1

Paso 2: Elección de los eventos a los que desea suscribirse

En este tutorial, mantendremos la configuración sencilla y haremos que este webhook se suscriba únicamente a eventos file.created. La carga útil JSON que usaremos para la creación del webhook será la siguiente.

1{
2 "data": {
3 "name": "asset.created sample webhook",
4 "events": ["file.created"],
5 "url": "https://webhook.site/c05f2216-9558-4816-bc09-f77ee7b9de40"
6 }
7}

Paso 3: Creación de un recurso de webhook con Postman

Use Postman para realizar una llamada de API y crear el recurso de webhook, proporcionando el punto final de webhook.site en la carga útil.

Paso 4: Prueba

Ahora que ha creado la suscripción de webhook y tiene configurado un punto final para recibir webhooks, es el momento de probarlo activando el primer webhook mediante la acción correspondiente.

Dado que el ejemplo se ha configurado para activarse con el activador file.created, cargaremos un activo nuevo en cualquier Project de la Account y el Workspace correspondientes en los que se haya configurado el webhook.

Ejemplo del paso 4

Recursos adicionales