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;
}
Remarques importantes : L'horodatage ne devrait être repris / analysé que sous forme de chaîne de caractères, car une analyse syntaxique dans un objet DateTime ou similaire peut contenir des sources d'erreur en ce qui concerne le formatage. Assurez-vous que votre secret est conservé en toute sécurité et n'est pas accessible au public. L'en-tête x-hook-signature est essentiel, car il permet la vérification. Cette procédure vous permet de vous assurer que les appels au webhook dans votre application sont authentiques et proviennent uniquement de sources autorisées.
Mis à jour le : 26/11/2024
Merci !