Webhook: Signatur prüfen
Nachschlagewerk für Webentwickler. Prüfe mit HMAC-SHA256 und dem Signing Secret, dass eine Webhook-Nachricht wirklich von meetpiloot kommt und nicht alt ist.
PlusFür Entwickler1 Min. Lesezeit
Auf dieser Seite1
Jede Nachricht trägt den Header X-Meetpiloot-Signature: sha256= gefolgt von einem HMAC-SHA256 über den exakten Body, mit deinem Signing Secret als Schlüssel. Berechne ihn über den rohen Body neu und vergleiche mit einer timing-sicheren Funktion.
X-Meetpiloot-Timestamp enthält den Sendezeitpunkt in ISO-8601. Lehne Nachrichten ab, die älter als ein paar Minuten sind, damit eine abgefangene Nachricht nicht später erneut abgespielt werden kann.
Beispiel in 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 wirft bei ungleicher Länge einen Fehler, also zuerst prüfen.
if (a.length !== b.length) return false;
return crypto.timingSafeEqual(a, b);
}
// Achtung express.raw(): Die Signatur gilt für die exakten Bytes, die wir gesendet haben,
// also prüfen, bevor du das JSON parst oder neu serialisierst.
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); // Übung, kein echter Lead
res.sendStatus(200); // erst antworten ...
forwardToCrm(payload); // ... dann die langsame Arbeit
});Auch interessant
Kommst du nicht weiter?
Schreib uns oder öffne ein Ticket in deinem Dashboard. Antwort innerhalb von 1 bis 2 Werktagen.