Passer au contenu principal
Firecrawl signe chaque requête de webhook à l’aide du HMAC-SHA256. La vérification des signatures garantit que les requêtes sont authentiques et n’ont pas été altérées.

Clé secrète

Le secret de votre webhook est disponible dans l’onglet Avancé des paramètres de votre compte. Chaque compte dispose d’un secret unique utilisé pour signer toutes les requêtes webhook.
Gardez le secret de votre webhook en lieu sûr et ne l’exposez jamais publiquement. Si vous pensez que votre secret a été compromis, régénérez-le immédiatement depuis les paramètres de votre compte.

Vérification de la signature

Chaque requête de webhook inclut un en-tête X-Firecrawl-Signature :
X-Firecrawl-Signature: sha256=abc123def456...

Comment vérifier

  1. Extraire la signature de l’en-tête X-Firecrawl-Signature
  2. Récupérer le corps brut de la requête (ne le parsez pas au préalable)
  3. Calculer le HMAC-SHA256 avec votre clé secrète
  4. Comparer les signatures à l’aide d’une fonction de comparaison à durée constante

Implémentation

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

const app = express();

// Utiliser un parseur de corps brut pour vérifier la signature
app.use('/webhook/firecrawl', express.raw({ type: 'application/json' }));

app.post('/webhook/firecrawl', (req, res) => {
  const signature = req.get('X-Firecrawl-Signature');
  const webhookSecret = process.env.FIRECRAWL_WEBHOOK_SECRET;
  
  if (!signature || !webhookSecret) {
    return res.status(401).send('Non autorisé');
  }
  
  // Extract hash from signature header
  // Extraire le hash de l’en-tête de signature
  if (algorithm !== 'sha256') {
    return res.status(401).send('Algorithme de signature invalide');
  }
  
  // Calculer la signature attendue
  const expectedSignature = crypto
    .createHmac('sha256', webhookSecret)
    .update(req.body)
    .digest('hex');
  
  // Vérifier la signature avec une comparaison sûre au timing
  if (!crypto.timingSafeEqual(Buffer.from(hash, 'hex'), Buffer.from(expectedSignature, 'hex'))) {
    return res.status(401).send('Signature invalide');
  }
  
  // Analyser et traiter le webhook vérifié
  const event = JSON.parse(req.body);
  console.log('Webhook Firecrawl vérifié :', event);
  
  res.status(200).send('ok');
});

app.listen(3000, () => console.log('Écoute sur le port 3000'));

Bonnes pratiques

Toujours vérifier les signatures

Ne traitez jamais une requête de webhook sans avoir d’abord vérifié sa signature :
app.post('/webhook', (req, res) => {
  if (!verifySignature(req)) {
    return res.status(401).send('Accès non autorisé');
  }
  processWebhook(req.body);
  res.status(200).send('OK');
});

Utilisez des comparaisons à temps constant

La comparaison de chaînes standard peut révéler des informations temporelles. Utilisez crypto.timingSafeEqual() dans Node.js ou hmac.compare_digest() en Python.

Utiliser HTTPS

Utilisez toujours un point de terminaison HTTPS pour votre webhook afin de garantir que les données sont chiffrées en transit.