Zum Inhalt

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
  1. Beispiel in Node.js (Express)
Verfügbar im Tarif Plus.

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
});

Erzeugst du in deinem Dashboard ein neues Secret, ist das alte sofort ungültig. Trag das neue Secret also gleich auch im empfangenden System ein.

Kommst du nicht weiter?

Schreib uns oder öffne ein Ticket in deinem Dashboard. Antwort innerhalb von 1 bis 2 Werktagen.