Leaper Central de Ajuda
Desenvolvedores Entrar

Segurança e Validação

Como validar as requisições com assinatura HMAC.

Toda chamada vai assinada. Verificar essa assinatura garante que a requisição veio da Leaper e que ninguém alterou o conteúdo no caminho — sem isso, qualquer pessoa que descubra a URL do seu endpoint pode enviar dados falsos.

Como validar

  1. 1Pegue o secretNa tela de Webhooks, clique em 'Ver secret' e copie o valor. Guarde em variável de ambiente no seu servidor, nunca no código.
  2. 2Assine o corpo brutoCalcule o HMAC-SHA256 sobre os bytes exatos que chegaram, antes de qualquer conversão para objeto. Se fizer JSON.parse e depois JSON.stringify de novo, a ordem das chaves pode mudar e a assinatura nunca vai bater.
  3. 3Compare com tempo constanteO resultado, prefixado por 'sha256=', deve bater com o header X-Webhook-Signature. Use comparação de tempo constante (hmac.compare_digest em Python, crypto.timingSafeEqual em Node) — nunca ==.
  4. 4Rejeite se não baterSe a assinatura não bater, responda 401 Unauthorized e nunca processe a requisição.

Exemplo em Node.js

const crypto = require('crypto'); const recebida = req.header('X-Webhook-Signature') || ''; const esperada = 'sha256=' + crypto.createHmac('sha256', process.env.LEAPER_WEBHOOK_SECRET).update(req.body).digest('hex'); const a = Buffer.from(recebida), b = Buffer.from(esperada); if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) return res.sendStatus(401); Exemplos completos em Node, PHP e Python estão em verificar a assinatura.

Dicas

  • Trate repetições: uma entrega pode chegar mais de uma vez. O campo event_id identifica a entrega e se repete nas retentativas — guarde os que já processou e descarte o que voltar.
  • Use o code, não o name: nomes de etapa podem ser renomeados no painel; os códigos são estáveis.
  • Aceite campos novos: podemos acrescentar campos ao payload sem aviso. Ignore o que não conhece em vez de falhar.
  • Se suspeitar que o secret foi comprometido, exclua o webhook e crie um novo — um novo secret será gerado.