Comment vérifier un appel à un webhook?
Introduction
Dans cet article, nous vous montrons comment vérifier les appels Webhook dans votre application. Cette vérification permet de s'assurer que l'appel Webhook provient bien de la source attendue (smino api) en utilisant un hachage SHA512 généré avec une clé secrète (Secret), un horodatage et un Event-ID.
Conditions préalables
- Un webhook a été mis en place et une clé secrète (secret) a été définie. L'appel au 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 :
- Extraction des informations nécessaires: Le serveur envoie une valeur de hachage dans l'en-tête de l'appel Webhook, que nous interceptons avec le nom x-hook-signature.
- Création du hachage attendu: Nous générons un hachage à partir du secret, de l'horodatage et de l'ID d'événement que contient le webhook.
- Comparaison des hashs: Le hash reçu est comparé au hash que nous avons généré. Si les hashs correspondent, le webhook peut être considéré comme vérifié.
Exemple en C#
Voici un exemple de code en C# qui montre comment la vérification est effectuée :
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 : 26/11/2024
Merci !