Como verificar que los webhooks son enviados por DEUNA

Cuando se integra con nuestra plataforma, es altamente recomendado verificar las firmas de los webhooks para asegurarse de que los eventos recibidos son enviados por nosotros y no por un tercero. Firmamos los eventos de webhook enviados a sus puntos finales incluyendo una firma en el encabezado llamado X-Signature de cada evento. Esto le permite verificar la autenticidad de los eventos.

Importancia de la Verificación de Firmas de Webhook

Para proteger su servidor de eventos de webhook no autorizados, recomendamos el uso de firmas de Código de Autenticación de Mensajes Basado en Hash (HMAC usando el algoritmo SHA256) para nuestros webhooks que lo admiten. Para los webhooks que admiten habilitar firmas HMAC, cada evento incluirá una firma calculada utilizando una clave HMAC secreta y el payload del webhook. Al verificar esta firma, puede confirmar que:

  • El webhook fue enviado por nosotros.
  • El payload no fue modificado durante la transmisión.

Cómo Verificar la Firma del Webhook?

  1. Recuperar la Firma: Extraiga el encabezado X-Signature de la solicitud entrante del webhook.
  2. Generar la Firma Esperada: Utilice la misma clave HMAC secreta (private API Key) y el payload del webhook para generar la firma esperada.
  3. Comparar Firmas: Compare la firma generada con la firma recibida. Si coinciden, el webhook es legítimo.

Código de Ejemplo para Verificar la Firma

Aquí hay ejemplos en varios lenguajes para ilustrar cómo verificar la firma HMAC SHA256:

Python

import hmac
import hashlib
import base64
import json

def validate_hmac_sha256_signature(secret, payload, signature):
    secret_bytes = bytes(secret, 'utf-8')
    payload_bytes = json.dumps(payload).encode('utf-8')
    h = hmac.new(secret_bytes, payload_bytes, hashlib.sha256)
    expected_signature = base64.b64encode(h.digest()).decode('utf-8')
    return hmac.compare_digest(signature, expected_signature)

# Example
secret = "<your-private-api-key>"
payload = { # incoming from the webhook
    "key": "value"
}
signature = "<value inside header X-Signature>"

if validate_hmac_sha256_signature(secret, payload, signature):
    print("Signature is valid.")
else:
    print("Signature is invalid.")

JS (Node.js)

function verifyWebhookSignature(secret, payload, signature) {
    const payloadString = JSON.stringify(payload);
    const hmac = crypto.createHmac('sha256', secret);
    hmac.update(payloadString);
    const expectedSignature = hmac.digest('base64');
    return expectedSignature === signature;
}

// Example
const secret = '<your-private-api-key>';
const payload = { // incoming from the webhook
    key: 'value'
};
const signature = '<value inside header X-Signature>';

if (verifyWebhookSignature(secret, payload, signature)) {
    console.log('Signature is valid.');
} else {
    console.log('Signature is invalid.');
}