Avance
Verification des signatures webhook
Verifiez l'authenticite des webhooks Gessify en validant la signature HMAC-SHA256.
Chaque webhook envoye par Gessify est signe avec HMAC-SHA256.
Principe
- Gessify calcule un HMAC-SHA256 du body JSON avec votre secret
- La signature est envoyee dans le header
X-Webhook-Signature - Votre serveur recalcule le HMAC et compare les deux valeurs
Exemples de code
const crypto = require("crypto");
function verifyWebhookSignature(body, secret, signature) {
const expected = crypto
.createHmac("sha256", secret)
.update(body)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}
app.post("/webhook", (req, res) => {
const signature = req.headers["x-webhook-signature"];
const body = JSON.stringify(req.body);
if (!verifyWebhookSignature(body, "votre_secret", signature)) {
return res.status(401).json({ error: "Invalid signature" });
}
// Traiter l'evenement...
res.status(200).json({ received: true });
});import hmac
import hashlib
from flask import Flask, request, jsonify
app = Flask(__name__)
def verify_signature(body, secret, signature):
expected = hmac.new(
secret.encode(), body, hashlib.sha256
).hexdigest()
return hmac.compare_digest(signature, expected)
@app.route("/webhook", methods=["POST"])
def webhook():
signature = request.headers.get("X-Webhook-Signature", "")
if not verify_signature(request.data, "votre_secret", signature):
return jsonify({"error": "Invalid signature"}), 401
return jsonify({"received": True}), 200<?php
$body = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';
$secret = 'votre_secret';
$expected = hash_hmac('sha256', $body, $secret);
if (!hash_equals($expected, $signature)) {
http_response_code(401);
echo json_encode(['error' => 'Invalid signature']);
exit;
}
http_response_code(200);
echo json_encode(['received' => true]);Utilisez toujours une comparaison a temps constant (timingSafeEqual, compare_digest, hash_equals) pour eviter les attaques par timing.