Gessify
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

  1. Gessify calcule un HMAC-SHA256 du body JSON avec votre secret
  2. La signature est envoyee dans le header X-Webhook-Signature
  3. 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.

On this page