Desenvolvedores · Webhooks
Verificar a assinatura
Cada aviso vem assinado com o segredo do webhook. Verifique antes de confiar no conteúdo.
Os cabeçalhos
Os avisos seguem o Standard Webhooks: qualquer biblioteca dessa especificação os verifica com o segredo que você recebe ao criar o webhook.
webhook-id: o id do evento, igual em cada nova tentativa. Serve para não processá-lo duas vezes.webhook-timestamp: a hora do envio, em segundos. Descarte avisos de mais de 5 minutos.webhook-signature:v1,seguido do HMAC-SHA256 em base64 deid.timestamp.corpo.
Verificar em Node, sem bibliotecas
const crypto = require('crypto');
const signed = `${headers['webhook-id']}.${headers['webhook-timestamp']}.${rawBody}`;
const key = Buffer.from(secret.replace(/^whsec_/, ''), 'base64');
const expected = crypto.createHmac('sha256', key).update(signed).digest('base64');
const valid = headers['webhook-signature']
.split(' ')
.some((part) => part === `v1,${expected}`);
Use o corpo exatamente como chegou (rawBody), antes de convertê-lo em JSON: qualquer mudança de espaços quebra a assinatura.
Verificar em Python
import base64, hashlib, hmac
signed = f"{h['webhook-id']}.{h['webhook-timestamp']}.".encode() + raw_body
key = base64.b64decode(secret.removeprefix("whsec_"))
expected = base64.b64encode(hmac.new(key, signed, hashlib.sha256).digest()).decode()
valid = any(part == f"v1,{expected}" for part in h["webhook-signature"].split())
Trocar o segredo
Em Webhooks você pode trocar o segredo. O anterior continua assinando por 24 horas e o cabeçalho leva as duas assinaturas, assim o seu sistema não para enquanto você o atualiza.
Revisado em