> ## Knowledge Base Index
> Fetch the complete knowledge base index at: https://help.smino.com/sitemap.xml
> Use this file to discover available pages before exploring further.
> Pure-Markdown content can be obtained by appending a '.md' suffix to the content URLs listed in the sitemap (without the trailing slash).

# 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 :

```cs
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 doit être récupéré / analysé que sous forme de chaîne de caractères, car son analyse en objet DateTime ou similaire peut être source d'erreurs liées au formatage. Assure-toi que ta clé secrète est conservée en lieu sûr et qu'elle n'est pas accessible au public. L'en-tête x-hook-signature est essentiel, car il permet la vérification. Cette procédure te permet de t'assurer que les appels de webhook dans ton application sont authentiques et proviennent uniquement de sources autorisées.