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
- Sempre verifique a assinatura antes de processar o webhook
- Use comparação em tempo constante para evitar timing attacks
- Responda 200 rapidamente e processe o evento de forma assíncrona
- Implemente idempotência usando
dispatchId + status como chave de deduplicação