
Langue 🇨🇦 Français (Canada)
Aperçu
Implémentation
Dans les coulisses
Avec FastComments, il est possible d'invoquer un API endpoint chaque fois qu'un commentaire est ajouté, mis à jour ou supprimé de notre système.
Nous réalisons cela à l'aide de webhooks asynchrones via HTTP/HTTPS.
Qu'est-ce qu'un webhook 
Un Webhook est un mécanisme, ou une intégration, entre deux systèmes où le "producteur" (FastComments) déclenche un événement que le "consommateur" (Vous) consomme via un appel d'API.
Événements et ressources pris en charge 
FastComments prend en charge les webhooks uniquement pour la ressource Comment.
Nous prenons en charge les webhooks pour la création, la suppression et la mise à jour des commentaires.
Chacun de ceux-ci est considéré comme un événement distinct dans notre système et, à ce titre, possède des sémantiques et des structures différentes pour les événements de webhook.
Configuration pour le développement local 
Pour le développement local, utilisez un outil comme ngrok.
Afin de simplifier le maintien de la sécurité du système, le développement local suit le même processus que la configuration et la sécurisation des autres environnements.
Étape 1 : Ajoutez "localhost" aux domaines de votre compte.
Ajoutez "localhost" en tant que domaine ici.
Étape 2 : Choisissez une clé API
Nous allons ajouter une configuration de webhook pour votre domaine, donc nous aurons besoin d'une clé API. Vous pouvez le faire ici.
Sous « Associate with domain » - sélectionnez votre domaine "localhost".
REMARQUE : Alternativement, vous pouvez utiliser un seul API Secret pour toute l'activité de test et les environnements de préproduction. Ajoutez simplement un API Secret pour "All Domains", et donnez-lui un nom comme "test".
Assurez-vous d'avoir un API Secret défini pour vos domaines de production. Les événements pour tous les autres domaines utiliseront le secret générique (de test).
Étape 3 : Ajoutez votre webhook
Pendant que ngrok ou un outil similaire est en cours d'exécution, définissez la valeur pour "localhost" ici.
Lorsque vous cliquez sur Send Test Payload, nous enverrons deux événements de test pour vérifier que vous validez la clé API.
Une fois validé, cliquez sur Save.
Étape 4 : Ajoutez un commentaire
Vous pouvez maintenant ajouter, modifier ou supprimer des commentaires et devriez nous voir appeler votre machine de développement locale avec les événements, en utilisant votre clé API de test. Il peut y avoir un délai allant jusqu'à 30 secondes pour que les événements atteignent votre machine.
Configuration 
Suivez les mêmes étapes pour localhost que pour la production. Assurez-vous d'avoir configuré les domaines de production et les API Secrets.
First, navigate to the Administration des webhooks. This is accessible via Gérer les données -> Webhooks.
The configuration page appears as follows:
Sur cette page, vous pouvez spécifier des endpoints pour chaque type d'événement de commentaire.
Pour chaque type d'événement, assurez-vous de cliquer sur Envoyer la charge utile de test pour vérifier que votre intégration est correctement configurée. Voir la section suivante, «Tests», pour plus de détails.
Tests 
Dans l'interface d'administration des Webhooks il y a des boutons Send Test Payload pour chaque type d'événement (Create, Update, Delete). Les événements Create et Update envoient un objet WebhookComment factice, tandis que le test de Delete enverra un corps de requête factice contenant uniquement un ID.
Vérification des charges utiles
Lorsque vous testez votre intégration webhook, vérifiez que les requêtes entrantes incluent les en-têtes suivants :
token- Votre secret d'APIX-FastComments-Timestamp- Horodatage Unix (secondes)X-FastComments-Signature- Signature HMAC-SHA256
Utilisez la vérification de la signature HMAC pour vous assurer que les charges utiles sont authentiques.
Outils de test
Vous pouvez utiliser des outils comme webhook.site ou ngrok pour inspecter les charges utiles des webhooks entrants pendant le développement.
Types d'événements
- Create Event: Déclenché lorsqu'un nouveau commentaire est créé. Méthode par défaut : PUT
- Update Event: Déclenché lorsqu'un commentaire est modifié. Méthode par défaut : PUT
- Delete Event: Déclenché lorsqu'un commentaire est supprimé. Méthode par défaut : DELETE
Chaque événement inclut l'intégralité des données du commentaire dans le corps de la requête (voir Structures de données pour le format de la charge utile).
Structures de données 
La seule structure envoyée via les webhooks est l'objet WebhookComment, décrit en TypeScript ci-dessous.
Structure de l'objet WebhookComment
Structure de l'événement "create"
Le corps de la requête de l'événement "create" est un objet WebhookComment.
Structure de l'événement "update"
Le corps de la requête de l'événement "update" est un objet WebhookComment.
Structure de l'événement "delete"
Le corps de la requête de l'événement "delete" est un objet WebhookComment.
Modification du 14 nov. 2023
Auparavant, le corps de la requête de l'événement "delete" ne contenait que l'id du commentaire. Il contient maintenant le commentaire complet au moment de la suppression.
Run 
Lorsque des utilisateurs sont tagués dans un commentaire, l'information est stockée dans une liste appelée mentions. Chaque objet de cette liste a la structure suivante.
Run 
Méthodes HTTP
Vous pouvez configurer la méthode HTTP pour chaque type d'événement webhook dans le panneau d'administration :
- Événement « create » : POST ou PUT (par défaut : PUT)
- Événement « update » : POST ou PUT (par défaut : PUT)
- Événement « delete » : DELETE, POST ou PUT (par défaut : DELETE)
Puisque toutes les requêtes contiennent un ID, les opérations Create et Update sont idempotentes par défaut (PUT). Répéter la même requête Create ou Update ne devrait pas créer d'objets en double de votre côté.
En-têtes de requête
Chaque requête webhook inclut les en-têtes suivants :
| Header | Description |
|---|---|
Content-Type |
application/json |
token |
Votre secret d'API |
X-FastComments-Timestamp |
Timestamp Unix (secondes) indiquant le moment où la requête a été signée |
X-FastComments-Signature |
Signature HMAC-SHA256 (sha256=<hex>) |
Voir Sécurité et jetons d'API pour des informations sur la vérification de la signature HMAC.
Sécurité et jetons d'API 
FastComments webhook requests include multiple authentication mechanisms for security.
En-têtes envoyés
| En-tête | Description |
|---|---|
token |
Votre API Secret (pour rétrocompatibilité) |
X-FastComments-Timestamp |
Timestamp Unix (secondes) indiquant quand la requête a été signée |
X-FastComments-Signature |
Signature HMAC-SHA256 de la charge utile |
Vérification de la signature HMAC (recommandée)
Nous recommandons fortement de vérifier la signature HMAC afin de vous assurer que les charges utiles des webhooks sont authentiques et n'ont pas été modifiées.
Format de la signature : sha256=<hex-encoded-signature>
Comment la signature est calculée :
- Concaténer :
timestamp + "." + JSON_payload_body - Calculer HMAC-SHA256 en utilisant votre API Secret comme clé
- Encoder le résultat en hexadécimal
Exemple de vérification (Node.js)
const crypto = require('crypto');
function verifyWebhookSignature(req, apiSecret) {
const timestamp = req.headers['x-fastcomments-timestamp'];
const signature = req.headers['x-fastcomments-signature'];
if (!timestamp || !signature) {
return false;
}
// Vérifier que le timestamp est récent (moins de 5 minutes)
const now = Math.floor(Date.now() / 1000);
if (Math.abs(now - parseInt(timestamp, 10)) > 300) {
return false; // Prévention des attaques par rejeu
}
// Vérifier la signature
const payload = JSON.stringify(req.body);
const expectedSignature = crypto
.createHmac('sha256', apiSecret)
.update(`${timestamp}.${payload}`)
.digest('hex');
return signature === `sha256=${expectedSignature}`;
}
Exemple de vérification (Python)
import hmac
import hashlib
import time
import json
def verify_webhook_signature(headers, body, api_secret):
timestamp = headers.get('X-FastComments-Timestamp')
signature = headers.get('X-FastComments-Signature')
if not timestamp or not signature:
return False
# Vérifier que le timestamp est récent
now = int(time.time())
if abs(now - int(timestamp)) > 300:
return False
# Vérifier la signature
payload = json.dumps(body, separators=(',', ':'))
message = f"{timestamp}.{payload}"
expected = hmac.new(
api_secret.encode(),
message.encode(),
hashlib.sha256
).hexdigest()
return signature == f"sha256={expected}"
Exemple de vérification (PHP)
function verifyWebhookSignature($headers, $body, $apiSecret) {
$timestamp = $headers['X-FastComments-Timestamp'] ?? null;
$signature = $headers['X-FastComments-Signature'] ?? null;
if (!$timestamp || !$signature) {
return false;
}
// Vérifier que le timestamp est récent (moins de 5 minutes)
$now = time();
if (abs($now - intval($timestamp)) > 300) {
return false;
}
// Vérifier la signature
$payload = json_encode($body, JSON_UNESCAPED_SLASHES);
$message = $timestamp . '.' . $payload;
$expectedSignature = 'sha256=' . hash_hmac('sha256', $message, $apiSecret);
return hash_equals($expectedSignature, $signature);
}
Authentification héritée
L'en-tête token contenant votre API Secret est toujours envoyé pour des raisons de rétrocompatibilité. Toutefois, nous recommandons de migrer vers la vérification HMAC pour une meilleure sécurité, car elle protège contre les attaques par rejeu.
Fonctionnement et gestion des réessais 
Tous les changements apportés au Comment object dans le système déclenchent un événement qui se retrouve dans une file d'attente.
L'événement webhook initial est généralement envoyé dans les six secondes suivant la survenue de l'événement source.
Vous pouvez surveiller cette file d'attente dans le Webhooks admin au cas où votre API tomberait.
Si une requête vers votre API échoue, nous la remettrons en file d'attente selon un calendrier.
Ce calendrier est 1 Minute * the retry count. Si l'appel échoue une fois, il réessaiera dans
une minute. S'il échoue deux fois, il attendra alors deux minutes, et ainsi de suite. Cela permet
d'éviter de surcharger votre API si vous tombez en panne pour des raisons liées à la charge.
Les webhooks peuvent être annulés depuis la page des journaux.
En conclusion
Ceci conclut notre documentation sur les Webhooks.
Nous espérons que vous trouverez l'intégration Webhook de FastComments facile à comprendre et rapide à configurer.
Si vous pensez avoir identifié des lacunes dans notre documentation, faites-nous savoir ci-dessous.