Aller au contenu principal

Signature des Webhooks

Secret HMAC

Comment fonctionne HMAC

HMAC implique l'utilisation d'une fonction de hachage cryptographique (dans ce cas, SHA-256) et d'une clé secrète pour produire une signature unique pour la charge utile. Cette signature est ensuite envoyée avec la requête. Le récepteur peut utiliser la même clé secrète pour générer une signature pour la charge utile reçue et la comparer avec la signature fournie. Si les deux signatures correspondent, la charge utile est considérée comme authentique.

Où trouver le secret

Pour récupérer le secret, allez dans la page développeur dans la section webhook. Ici, vous trouverez la clé secrète pour vérifier les signatures. Si nécessaire, vous pouvez également faire pivoter le secret pour assurer une sécurité continue.

attention

Faire pivoter le secret invalidera l'ancienne clé et générera une nouvelle, qui devra ensuite être mise à jour dans votre application pour maintenir le bon fonctionnement du webhook.

Emplacement du secret du Webhook

Exemples d'implémentation

Génération de la signature

const crypto = require('crypto');

const generateSignature = (secret, payload) => {
return crypto.createHmac('sha256', secret).update(payload).digest('hex');
};

Vérification de la signature

const verifySignature = (secret, payload, receivedSignature) => {
const expectedSignature = generateSignature(secret, payload);
try {
return crypto.timingSafeEqual(Buffer.from(expectedSignature), Buffer.from(receivedSignature));
} catch (e) {
return false;
}
};

Gestion de la requête Webhook

const express = require('express');
const app = express();
app.use(express.json());

app.post('/webhook', function(req, res) {
const secret = process.env.SECRET;
const signature = req.headers['x-signature'];

if (signature == null) {
res.status(403).send({ message: 'Signature non trouvée' });
} else if (verifySignature(secret, JSON.stringify(req.body), signature)) {
res.status(200).send({ message: 'La signature du webhook est valide' });
} else {
res.status(403).send({ message: 'La signature du webhook est invalide' });
}
});

app.listen(3000, () => {
console.log('Le serveur tourne sur le port 3000');
});