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
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
});À lire aussi
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.