Aller au contenu

Webhook : vérifier la signature

Référence pour développeurs. Vérifiez avec HMAC-SHA256 et le signing secret qu'un message webhook provient bien de meetpiloot et n'est pas périmé.

PlusPour les développeurs1 min de lecture
Sur cette page1
  1. Exemple en Node.js (Express)
Disponible avec Plus.

Chaque message porte l'en-tête X-Meetpiloot-Signature : sha256= suivi d'un HMAC-SHA256 calculé sur le corps exact, avec votre signing secret comme clé. Recalculez-le sur le corps brut et comparez les deux valeurs avec une fonction à temps constant, qui résiste aux attaques temporelles.

X-Meetpiloot-Timestamp contient le moment d'envoi au format ISO-8601. Refusez les messages vieux de plus de quelques minutes, pour qu'un message intercepté ne puisse pas être rejoué plus tard.

Exemple en Node.js (Express)

JavaScript
const crypto = require('crypto');

function isFromMeetpiloot(rawBody, header, secret) {
  const expected =
    'sha256=' + crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
  const a = Buffer.from(header || '');
  const b = Buffer.from(expected);
  // timingSafeEqual lève une erreur si les longueurs diffèrent, donc on vérifie d'abord.
  if (a.length !== b.length) return false;
  return crypto.timingSafeEqual(a, b);
}

// Attention à express.raw() : la signature porte sur les octets exacts envoyés,
// donc vérifiez avant de parser le JSON ou de le resérialiser.
app.post('/meetpiloot', express.raw({ type: 'application/json' }), (req, res) => {
  if (!isFromMeetpiloot(req.body, req.get('X-Meetpiloot-Signature'), process.env.MP_SECRET)) {
    return res.sendStatus(401);
  }
  const payload = JSON.parse(req.body.toString('utf8'));
  if (payload.event === 'lead.test') return res.sendStatus(200); // exercice, pas un vrai lead
  res.sendStatus(200);   // répondre d'abord...
  forwardToCrm(payload); // ...puis le travail lent
});

Dès que vous générez un nouveau secret dans votre tableau de bord, l'ancien n'est plus valable. Configurez donc immédiatement le nouveau secret dans le système destinataire.

Vous êtes bloqué ?

Envoyez-nous un e-mail ou ouvrez un ticket depuis votre tableau de bord. Nous répondons sous 1 à 2 jours ouvrables.