Skip to main content
Se você configurou um secret no webhook, cada requisição inclui o header X-Webhook-Signature com uma assinatura HMAC-SHA256 do body.

Como Verificar

A assinatura é calculada assim:
HMAC-SHA256(secret, request_body)

Exemplos de Verificação

import hmac
import hashlib

def verify_webhook(body: bytes, signature: str, secret: str) -> bool:
    expected = hmac.new(
        secret.encode('utf-8'),
        body,
        hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(expected, signature)

# No seu endpoint Flask/FastAPI:
@app.post("/webhook")
async def handle_webhook(request: Request):
    body = await request.body()
    signature = request.headers.get("X-Webhook-Signature", "")

    if not verify_webhook(body, signature, WEBHOOK_SECRET):
        return Response(status_code=401)

    payload = json.loads(body)
    # Processar o evento...
    return Response(status_code=200)
Sempre use comparação em tempo constante (hmac.compare_digest no Python, timingSafeEqual no Node.js) para evitar ataques de timing.

Boas Práticas

  1. Sempre verifique a assinatura antes de processar o webhook
  2. Use comparação em tempo constante para evitar timing attacks
  3. Responda 200 rapidamente e processe o evento de forma assíncrona
  4. Implemente idempotência usando dispatchId + status como chave de deduplicação