Vérifier l'authenticité

Vérifier l'authenticité des notifications Helloasso

Vérifier l'authenticité de la notification

Afin de d'authentifier la notification, vous pouvez vous baser sur l'adresse IP de la notification.

IP ProductionIP Test
51.138.206.2004.233.135.234

Signature de notification

⚠️Uniquement pour les partenaires pour le moment ⚠️

Chacune de vos Urls de notification sont maintenant associés à une SignatureKey (string)

Exemple de réponse de configuration d'une Url de notification :

{  
    "url": "https://www.helloassotest.com/",  
    "signatureKey": "AyCM0yTeQd8In2OzdP3R2HGTrYiCA818UCFLhrD9BCnNhTriWLipxEDpsaTbdfec"  
}

Vous trouverez dans le Header des notifications envoyés par Helloasso un champ x-ha-signature

NameValue
x-ha-signaturef4ec6cb50b13bfeae856c6675ae966a18dbb30dad40cc677147785192f192b49

Une fois que vous disposez de ces informations vous pouvez désormais vérifier si la notification provient bien de Helloasso.

Concrétement vous devez générer une signature Hmac 256 avec le body de la notification et votre signatureKey.

Si la signature en résultat est la même que celle reçu dans le header c'est que la notification provient bien de Helloasso.

Exemples concrets

C#

using System;
using System.Security.Cryptography;
using System.Text;

public class WebhookHandler
{
    private string ComputeHMACSHA256(string message, string secretKey)
    {
        // Convertir la clé secrète et le message en tableau de bytes
        byte[] keyBytes = Encoding.UTF8.GetBytes(secretKey);
        byte[] messageBytes = Encoding.UTF8.GetBytes(message);

        // Créer un objet HMAC-SHA256 avec la clé secrète
        using (var hmac = new HMACSHA256(keyBytes))
        {
            // Calculer le hash du message
            byte[] hashBytes = hmac.ComputeHash(messageBytes);

            // Convertir le hash en chaîne hexadécimale
            return BitConverter.ToString(hashBytes).Replace("-", "").ToLower();
        }
    }

    public bool VerifyWebhookAuthenticity(string requestBody, string receivedSignature, string secretKey)
    {
        // Calculer la signature HMAC-SHA256 du corps du message avec la clé secrète
        string computedSignature = ComputeHMACSHA256(requestBody, secretKey);

        // Comparer la signature calculée avec celle reçue
        return computedSignature.Equals(receivedSignature, StringComparison.OrdinalIgnoreCase);
    }

    public void HandleWebhook()
    {
        string secretKey = "AyCM0yTeQd8In2OzdP3R2HGTrYiCA818UCFLhrD9BCnNhTriWLipxEDpsaTbdfec";
        string requestBody = "{ 'eventType': 'Form', 'data': {...} }";
        string receivedSignature = httpRequest.Headers["x-ha-signature"]; // Remplacez par l'objet réel

        bool isAuthentic = VerifyWebhookAuthenticity(requestBody, receivedSignature, secretKey);

        if (isAuthentic)
        {
            Console.WriteLine("La notification webhook est authentique.");
        }
        else
        {
            Console.WriteLine("La notification webhook est invalide.");
        }
    }
}

PHP

<?php

// Clé secrète partagée
$secretKey = "AyCM0yTeQd8In2OzdP3R2HGTrYiCA818UCFLhrD9BCnNhTriWLipxEDpsaTbdfec";

// Contenu brut du corps de la requête
$requestBody = "{ 'eventType': 'Form', 'data': {...} }";

// Récupération de tous les en-têtes HTTP
$headers = getallheaders();

// Signature reçue dans les en-têtes de la requête
$receivedSignature = isset($headers['x-ha-signature']) ? $headers['x-ha-signature'] : null;

// Calculer la signature HMAC SHA-256
function computeHMACSHA256($data, $secretKey) {
    return hash_hmac('sha256', $data, $secretKey);
}

// Vérifier l'authenticité de la notification webhook
function verifyWebhookAuthenticity($requestBody, $receivedSignature, $secretKey) {
    $computedSignature = computeHMACSHA256($requestBody, $secretKey);
    return hash_equals($computedSignature, $receivedSignature);
}

// Effectuer la vérification
if (verifyWebhookAuthenticity($requestBody, $receivedSignature, $secretKey)) {
    echo "La notification webhook est authentique.";
} else {
    echo "La notification webhook est invalide.";
}

?>


What’s Next

Voir les exemples de notification