Pular para o conteúdo
meruma Desenvolvedores

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 de id.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