Vérification de signature
Chaque requête webhook inclut un header de signature que vous devez vérifier pour vous assurer que la requête provient bien d’Ikawaari.
Fonctionnement
Chaque endpoint webhook possède un secret de signature unique (commence par whsec_). Ikawaari utilise ce secret pour générer une signature HMAC-SHA256 incluse dans le header Ikawaari-Signature.
Étapes de vérification
1. Extraire la signature
Ikawaari-Signature: t=1708300800,v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd
2. Préparer le payload signé
{timestamp}.{raw_body}
3. Calculer la signature attendue
- Node.js
- Python
const crypto = require('crypto');
function verifyWebhookSignature(payload, header, secret) {
const [tPart, vPart] = header.split(',');
const timestamp = tPart.split('=')[1];
const signature = vPart.split('=')[1];
const signedPayload = `${timestamp}.${payload}`;
const expected = crypto
.createHmac('sha256', secret)
.update(signedPayload)
.digest('hex');
// Comparaison sûre vis-à-vis du timing
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}
import hmac
import hashlib
def verify_webhook_signature(payload: str, header: str, secret: str) -> bool:
parts = dict(p.split("=", 1) for p in header.split(","))
timestamp = parts["t"]
signature = parts["v1"]
signed_payload = f"{timestamp}.{payload}"
expected = hmac.new(
secret.encode(), signed_payload.encode(), hashlib.sha256
).hexdigest()
return hmac.compare_digest(signature, expected)
4. Rejeter les événements trop anciens
Vérifiez que l’horodatage se trouve dans une fenêtre de 5 minutes par rapport à l’heure courante afin de prévenir les attaques par rejeu.
attention
Vérifiez toujours les signatures webhook en production. Ne faites jamais confiance à un payload webhook sans vérification.