Comment vérifier un appel à un webhook?
Introduction
Cet article explique comment vérifier les appels Webhook dans votre application. Cette vérification permet de garantir que l'appel Webhook provient bien de la source attendue (Smino API), en utilisant un hachage SHA512 généré à partir d'une clé secrète (Secret), d'un horodatage et d'un Event-ID.
Conditions préalables
Un Webhook a été configuré et une clé secrète (Secret) a été définie.
L'appel Webhook contient un en-tête (x-hook-signature) qui contient le hachage envoyé par le serveur.
Fonctionnement
La vérification d'un appel Webhook se fait en trois étapes principales :
- Extraction des informations nécessaires: Le serveur envoie un hachage dans l'en-tête de l'appel Webhook, que nous interceptons à l'aide du nom x-hook-signature.
- Création du hachage attendu: Nous générons un hachage en utilisant le secret, l'horodatage et l'ID de l'événement présents dans le Webhook.
- Comparaison des hashs: Le hachage reçu est comparé à celui que nous avons généré. Si les deux hachages correspondent, le Webhook peut être considéré comme vérifié.
Exemple en C#
Voici un exemple de code en C# pour la vérification d'un Webhook :
using System.Globalization;
using System.Security.Cryptography;
using System.Text;
var response = new HttpResponseMessage();
const string signatureHeader = "x-hook-signature";
response.Headers.Add(signatureHeader, "<serverHash>");
const string secret = "<your secret>";
var payload = new { EventId = Guid.NewGuid(), TimeStamp = DateTime.UtcNow.ToString(CultureInfo.InvariantCulture)};
var expectedHash = CreateHash($"{payload.EventId:N}.{payload.TimeStamp}.{secret}");
var responseHash = response.Headers.GetValues(signatureHeader).Single();
VerifyHash(responseHash, expectedHash);
static string CreateHash(string signature)
{
var sha512 = SHA512.Create();
var bytes = Encoding.UTF8.GetBytes(signature);
var hash = sha512.ComputeHash(bytes);
return string.Concat(hash.Select(hashByte => hashByte.ToString("x2"))).ToUpper();
}
static bool VerifyHash(string responseHash, string expectedHash)
{
return responseHash == expectedHash;
}Mis à jour le : 29/09/2026
Merci !
