Saltar al contenido principal
Evocrawl firma todas las solicitudes de webhook mediante HMAC-SHA256. Verificar estas firmas garantiza que las solicitudes sean auténticas y no hayan sido manipuladas.

Clave secreta

Tu secreto de webhook está disponible en la pestaña Advanced de la configuración de tu cuenta. Cada cuenta tiene un secreto único que se utiliza para firmar todas las solicitudes de webhook.
Mantén tu secreto de webhook seguro y nunca lo expongas públicamente. Si crees que tu secreto se ha visto comprometido, regénéralo de inmediato desde la configuración de tu cuenta.

Verificación de firmas

Cada solicitud de webhook incluye un encabezado X-Evocrawl-Signature:
X-Evocrawl-Signature: sha256=abc123def456...

Cómo verificar

  1. Extrae la firma del encabezado X-Evocrawl-Signature
  2. Obtén el cuerpo sin procesar de la solicitud (antes de analizarlo)
  3. Calcula el HMAC-SHA256 usando tu clave secreta
  4. Compara las firmas usando una función de comparación segura frente al tiempo

Implementación

import crypto from 'crypto';
import express from 'express';

const app = express();

// Usa el analizador de cuerpo en bruto para verificar la firma
app.use('/webhook/firecrawl', express.raw({ type: 'application/json' }));

app.post('/webhook/firecrawl', (req, res) => {
  const signature = req.get('X-Evocrawl-Signature');
  const webhookSecret = process.env.FIRECRAWL_WEBHOOK_SECRET;
  
  if (!signature || !webhookSecret) {
    return res.status(401).send('No autorizado');
  }
  
  // Extrae el hash del encabezado de la firma
  const [algorithm, hash] = signature.split('=');
  if (algorithm !== 'sha256') {
    return res.status(401).send('Algoritmo de firma no válido');
  }
  
  // Calcula la firma esperada
  const expectedSignature = crypto
    .createHmac('sha256', webhookSecret)
    .update(req.body)
    .digest('hex');
  
  // Verifica la firma usando una comparación segura contra ataques de temporización
  if (!crypto.timingSafeEqual(Buffer.from(hash, 'hex'), Buffer.from(expectedSignature, 'hex'))) {
    return res.status(401).send('Firma no válida');
  }
  
  // Analiza y procesa el webhook verificado
  const event = JSON.parse(req.body);
  console.log('Webhook de Evocrawl verificado:', event);
  
  res.status(200).send('ok');
});

app.listen(3000, () => console.log('Escuchando en el puerto 3000'));

Buenas prácticas

  • Verifica cada solicitud. Comprueba siempre la firma antes de procesar una carga útil de webhook. Rechaza cualquier solicitud que no supere la verificación con un código de estado 401.
  • Usa comparaciones seguras en tiempo constante. Las comparaciones de cadenas estándar pueden filtrar información por temporización. Usa crypto.timingSafeEqual() en Node.js o hmac.compare_digest() en Python.
  • Expón tu endpoint a través de HTTPS. Esto garantiza que las cargas útiles de webhook estén cifradas durante la transmisión.