Webhooks V4

O que é um webhook?

Um webhook é um callback HTTP do tipo push que o Frame.io dispara assim que algo interessante acontece na sua conta (por exemplo, quando um novo arquivo termina a transcodificação, um comentário é adicionado ou um projeto é criado).

Em vez de consultar a API repetidamente, você fornece uma URL HTTPS pública; o Frame.io envia uma carga JSON para essa URL em tempo real para que você possa:

Sincronizar metadados com um DAM/MAM externo
Preencher canais do Slack ou sistemas de tickets

Para saber mais sobre o que é um webhook e o que ele faz, consulte https://docs.webhook.site/.

Visão geral do ponto de acesso

OperaçãoPonto de acessoDetalhes
Criar um webhookPOST /v4/accounts/{account_id}/workspaces/{workspace_id}/webhooksCorpo com name, url, events[]
Listar todos os webhooks de um espaço de trabalhoGET /v4/accounts/{account_id}/workspaces/{workspace_id}/webhooksOferece suporte à paginação
Expandir um webhookGET /v4/webhooks/{webhook_id}Retorna o segredo de assinatura somente no momento da criação
Atualizar um webhookPATCH /v4/webhooks/{webhook_id}Alterar url, events ou is_active
Excluirum webhookDELETE /v4/webhooks/{webhook_id}Interrompe imediatamente as entregas

Autenticação — Todos os pontos de acessoV4 exigem um token de acesso OAuth 2.0 obtido pelo Adobe Developer Console. Tokens de desenvolvedor legado e JWTs não são aceitos.

Alterações e atualizações no Frame V4

Webhooks criados no Legacy são transferidos para a V4 com as seguintes alterações:

  1. Estrutura de conteúdo: ID da conta adicionado ao conteúdo
  2. Alterações de ponto de acesso: team_id não é mais fornecido na carga JSON, mas no parâmetro de caminho da URL: https://api.frame.io/v4/accounts/:account_id/workspaces/:workspace_id/webhooks
  3. Integração de API: devido às mudanças na estrutura da API, nos pontos de acesso e nos métodos de autenticação, qualquer código existente para webhooks de entrada que faça chamadas subsequentes à API do Frame.io para enriquecimento e consulta de recursos precisará ser atualizado
  4. Tipos de evento: webhooks de ativo foram divididos em eventos separados de Arquivo e Pasta. Todos os webhooks vindos do Legacy com eventos de ativo precisam ser atualizados para terem os eventos apropriados de Arquivo e Pasta

Status do webhook após migração: quando sua conta migra para o Frame.io V4, webhooks existentes de versões anteriores são desativados automaticamente. Isso garante que você possa modificar seus pontos de acesso de webhook e a lógica de integração para funcionar com as atualizações da V4 antes de reativá-los. Webhooks que não tiverem sido atualizados para compatibilidade com a V4 encontrarão erros se forem ativados sem as modificações apropriadas. Você pode verificar quais webhooks estão inativos examinando o campo is_active por meio da API ou revisando suas configurações de webhook antes de ligá-los novamente.

Assinaturas de eventos de webhook

Ao criar e atualizar webhooks, identifique quais eventos são de seu interesse. Escolha poucos ou muitos eventos, conforme necessário, mas observe que a experiência é melhor quando você assina menos eventos, separando seus webhooks de forma lógica com diferentes esquemas de nomenclatura e pontos de acesso diferentes, para que sua lógica de negócios no lado receptor faça menos filtragem e roteamento em funções compartilhadas.

Escopo do evento: todos os eventos estão no escopo do Workspace fornecido durante a criação do webhook. Isso significa que os eventos serão enviados para ações realizadas em todos os projetos nesse Workspace.

Projetos

EventoDescrição
project.createdUm novo Projeto foi criado
project.updatedAs Configurações de um Projeto foram atualizadas
project.deletedUm Projeto foi deleted

Arquivos

EventoDescrição
file.createdUm Arquivo foi criado no Frame.io. Observação: isso é acionado antes que o arquivo termine o upload. Se o seu manipulador precisar do arquivo completo, recomendamos escutar o evento upload.completed em vez disso
file.readyTodas as transcodificações foram concluídas depois que um arquivo foi carregado e processado
file.updatedO nome de um Arquivo ou outras informações foram alteradas
file.deletedUm arquivo foi excluído (manual ou automaticamente)
file.upload.completedFoi feito upload de um arquivo
file.versionedUma versão de arquivo foi criada

Pastas

EventoDescrição
folder.createdUma nova pasta foi criada
folder.updatedAs configurações de uma pasta foram atualizadas
folder.deletedUma Pasta foi excluída

Comentários

EventoDescrição
comment.createdUm novo comentário ou resposta foi criado
comment.updatedUm comentário foi atualizado
comment.deletedUm comentário foi excluído
comment.completedUm comentário foi marcado como concluído
comment.uncompletedUm comentário foi marcado como não concluído

Metadados

EventoDescrição
metadata.value.updatedCampos de metadados atualizados para um ativo

Coleções

EventoDescrição
collection.createdUma nova coleção foi criada
collection.updatedUma coleção foi atualizada
collection.deletedUma coleção foi excluída

Campos personalizados

EventoDescrição
customfield.createdUm novo campo personalizado foi criado
customfield.updatedUm campo personalizado foi atualizado
customfield.deletedUm campo personalizado foi excluído

Compartilhamentos

EventoDescrição
share.createdUm novo compartilhamento foi criado
share.updatedUm compartilhamento foi atualizado
share.deletedUm compartilhamento foi excluído
share.viewedUm compartilhamento foi visualizado

Conteúdo da mensagem de webhook

Todos os conteúdos de webhook contêm um campo type, indicando o evento que ocorreu, e um objeto resource. O objeto resource contém o type e ID do recurso Frame.io relacionado ao evento.

Exemplo de conteúdo

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}

No exemplo acima de um evento file.created, o resource.id indica o ID do arquivo recém-criado. Além disso, são incluídos os objetos workspace, project e user, que contêm os respectivos workspace.id, project.id e user.id. Esses valores podem ser usados para reduzir chamadas de API filtrando eventos recebidos ou consultando dados armazenados localmente em cache.

Não incluímos nenhuma informação adicional além do ID do recurso sobre o recurso assinado.

Se o aplicativo exigir mais informações ou contexto, recomendamos fazer uma chamada de API para consultar mais informações sobre os recursos referenciados.

Segurança

Por padrão, todos os webhooks têm uma chave de assinatura. Esse segredo de assinatura não configurável pode ser usado para verificar se a solicitação se origina do Frame.io.

O conteúdo da resposta do webhook configurado inclui o segredo de assinatura específico desse webhook. Esse segredo é fornecido apenas nessa resposta inicial de criação do webhook; portanto, armazene-o em um local seguro no seu armazenamento de segredos ou em variáveis de ambiente. Use-o posteriormente para verificar se o webhook vem diretamente dos nossos servidores e não foi interceptado nem manipulado de nenhuma forma.

Verificação de assinaturas de webhook

Para proteger uma integração contra ataques man-in-the-middle e de repetição, é essencial verificar a assinatura do conteúdo do webhook. A verificação garante que os conteúdos de webhook tenham sido realmente enviados pelo Frame.io e que o conteúdo não tenha sido modificado durante o transporte.

Incluídos com a solicitação POST estão os seguintes cabeçalhos HTTP:

Nome do cabeçalhoDescriçãoExemplo
X-Frameio-Request-TimestampO carimbo de data e hora em que a solicitação foi enviada1604004499
X-Frameio-SignatureA assinatura calculada do webhookv0=a77ce6856e609c884575c2fd211d07a9ad1c3f72e19c06ff710e8f086ffca883
user-agent: "Frame.io V4 API"Agente do usuário no cabeçalho para v4
user-agent: "Frame.io Legacy API"Agente do usuário no cabeçalho para Legacy
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

O carimbo de data e hora é a hora do sistema nos sistemas do Frame.io quando o webhook de saída é enviado. Isso pode ser usado para evitar ataques de repetição. Recomendamos verificar se esse horário está dentro de 5 minutos em relação à hora local. A assinatura é um hash HMAC SHA256 usando a chave de assinatura fornecida quando o Webhook é criado pela primeira vez. Siga estas etapas para verificar a assinatura:

1

Extrair a assinatura

Extraia a assinatura dos cabeçalhos HTTP.

2

Criar mensagem para assinar

Crie uma mensagem para assinar combinando a versão, o horário de entrega e o corpo da solicitação: v0:timestamp:body.

3

Calcular HMAC SHA256

Calcule a assinatura HMAC SHA256 usando seu segredo de assinatura.

4

Comparar assinaturas

Compare a assinatura calculada com a fornecida.

A assinatura fornecida tem o prefixo v0=. Atualmente, o Frame.io tem apenas essa versão para assinar solicitações. Certifique-se de adicionar esse prefixo à assinatura calculada.

Novas tentativas e registro

Política de tentativas
  • Cinco tentativas no total (a inicial + 4 novas tentativas)

  • Recuo exponencial começando em 15 s (+ variação aleatória)

  • Um status não 2xx ou tempo-limite > 5 segundos aciona a nova tentativa

Registro de falhas

O Frame.io mantém um log de falhas com: webhook_id, account_id, event_type, resource_id, user_id.

Tutorial de webhook

Etapa 1: Configurar o lado receptor (feito primeiro para que você saiba qual será sua URL)

Aqui, usamos webhook.site, que permite criar facilmente um receptor de webhook de uso único que pode ser usado para inspecionar conteúdos e enviar respostas básicas sem nenhuma lógica de negócios real. Ao acessar https://webhook.site pela primeira vez, um ponto de acesso de webhook exclusivo é criado para você, que pode ser copiado imediatamente para uso.

Essa URL é exclusiva da sua sessão.

Exemplo da etapa 1

Etapa 2: Escolher os eventos que você deseja assinar

Neste tutorial, vamos manter tudo simples e configurar este webhook para assinar apenas eventos file.created. O conteúdo JSON que usaremos para criar o webhook será o seguinte.

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}

Etapa 3: Criar um recurso de webhook usando o Postman

Usando o Postman, faça uma chamada de API para criar o recurso de webhook, fornecendo o ponto de acesso do webhook.site no conteúdo.

Etapa 4: Testar!

Agora que você criou a assinatura do webhook e configurou um ponto de acesso para receber webhooks, é hora de testar acionando o primeiro webhook por meio da ação apropriada que fará com que ele seja disparado.

Como nossa amostra foi configurada para acionar o gatilho file.created, vamos carregar um novo ativo em qualquer Projeto dentro da Conta e do espaço de trabalho correspondentes em que o webhook foi configurado.

Exemplo da etapa 4

Recursos adicionais