
Sprog 🇩🇰 Dansk
Oversigt
Implementering
Bag kulisserne
Med FastComments er det muligt at kalde et API-endpoint, når en kommentar tilføjes, opdateres eller fjernes fra vores system.
Vi opnår dette med asynkrone webhooks over HTTP/HTTPS.
Hvad er Webhooks 
En Webhook er en mekanisme, eller en integration, mellem to systemer hvor "produceren" (FastComments) udløser en begivenhed som "forbrugeren" (dig) modtager via et API-opkald.
Understøttede hændelser og ressourcer 
FastComments understøtter kun webhooks for ressourcen Comment.
Vi understøtter webhooks ved oprettelse, fjernelse og opdatering af kommentarer.
Hver af disse betragtes som separate hændelser i vores system og har derfor forskellig semantik og struktur for webhook-hændelserne.
Opsætning til lokal udvikling 
Til lokal udvikling, brug et værktøj som ngrok.
For at gøre det nemmere at holde systemet sikkert følger lokal udvikling den samme proces som opsætning og sikring af andre miljøer.
Trin 1: Tilføj "localhost" til domæner i din konto.
Tilføj "localhost" som et domæne her.
Trin 2: Pick an API Key
Vi vil tilføje webhook-konfiguration for dit domæne, så vi får brug for en API Key. Du kan gøre det her.
Under "Associate with domain" - vælg dit "localhost" domæne.
NOTE: Alternativt kan du bruge én API Secret til al testaktivitet og staging-miljøer. Tilføj simpelthen en API Secret for "All Domains", og giv den et navn som "test".
Sørg for, at du har en API Secret defineret for dine produktionsdomæner. Events for alle andre domæner vil bruge wildcard (testing) secret.
Trin 3: Add Your Webhook
Mens ngrok eller et lignende værktøj kører, sæt værdien for "localhost" her.
Når du klikker på Send Test Payload, sender vi to test events for at kontrollere, at du validerer API key'en.
Når den er valideret, klik på Save.
Trin 4: Add A Comment
Nu kan du tilføje, redigere eller slette kommentarer og burde se, at vi kalder din lokale udviklingsmaskine med events, ved brug af din testing API Key. Der kan være op til 30 sekunders forsinkelse for events at nå din maskine.
Opsætning 
Følg de samme trin for localhost, som du ville for produktion. Sørg for, at du har opsat produktionsdomæner og API Secrets.
Først, gå til Webhooks admin. Dette er tilgængeligt via Manage Data -> Webhooks.
Konfigurationssiden ser sådan ud:
På denne side kan du angive endpoints for hver type kommentarhændelse.
For hver type hændelse skal du sørge for at klikke på Send Test Payload for at sikre, at du har opsat din integration korrekt. Se næste afsnit, "Testing", for detaljer.
Testning 
I Webhooks-admin er der Send Test Payload-knapper for hver hændelsestype (Create, Update, Delete). Create- og Update-hændelserne sender et dummy WebhookComment-objekt, mens test af Delete sender en dummy request body med kun et ID.
Bekræftelse af payloads
Når du tester din webhook-integration, skal du kontrollere, at de indkommende forespørgsler indeholder følgende headers:
token- Din API SecretX-FastComments-Timestamp- Unix-tidsstempel (sekunder)X-FastComments-Signature- HMAC-SHA256-signatur
Brug HMAC-signaturverificering for at sikre, at payloads er autentiske.
Testværktøjer
Du kan bruge værktøjer som webhook.site eller ngrok til at inspicere indkommende webhook-payloads under udvikling.
Hændelsestyper
- Create Event: Udløses, når en ny kommentar oprettes. Default method: PUT
- Update Event: Udløses, når en kommentar redigeres. Default method: PUT
- Delete Event: Udløses, når en kommentar slettes. Default method: DELETE
Hver hændelse inkluderer hele kommentardataene i request body'en (se Datastrukturer for payload-formatet).
Datastrukturer 
Den eneste struktur sendt via webhooks er WebhookComment-objektet, beskrevet i TypeScript nedenfor.
WebhookComment-objektets struktur
Strukturen for "create"-begivenheden
Requestbodyen for "create"-begivenheden er et WebhookComment-objekt.
Strukturen for "update"-begivenheden
Requestbodyen for "update"-begivenheden er et WebhookComment-objekt.
Strukturen for "delete"-begivenheden
Requestbodyen for "delete"-begivenheden er et WebhookComment-objekt.
Ændring pr. 14. nov. 2023
Tidligere indeholdt requestbodyen for "delete"-begivenheden kun kommentar-id'et. Den indeholder nu hele kommentaren på tidspunktet for sletningen.
Run 
Når brugere tagges i en kommentar, gemmes oplysningerne i en liste kaldet mentions. Hvert objekt i den liste
har følgende struktur.
Run 
HTTP-metoder
Du kan konfigurere HTTP-metoden for hver webhook-begivenhedstype i administrationspanelet:
- Oprettelsesbegivenhed: POST eller PUT (standard: PUT)
- Opdateringsbegivenhed: POST eller PUT (standard: PUT)
- Sletningsbegivenhed: DELETE, POST, eller PUT (standard: DELETE)
Da alle forespørgsler indeholder et ID, er Create- og Update-operationer idempotente som standard (PUT). Gentagelse af samme Create- eller Update-forespørgsel bør ikke oprette dublerede objekter på din side.
Anmodningsoverskrifter
Hver webhook-forespørgsel inkluderer følgende headers:
| Header | Description |
|---|---|
Content-Type |
application/json |
token |
Din API-secret |
X-FastComments-Timestamp |
Unix-timestamp (sekunder) da forespørgslen blev underskrevet |
X-FastComments-Signature |
HMAC-SHA256-signatur (sha256=<hex>) |
Se Sikkerhed & API Tokens for oplysninger om verifikation af HMAC-signaturen.
Sikkerhed og API-tokens 
FastComments webhook-forespørgsler indeholder flere autentificeringsmekanismer for sikkerhed.
Sendte headere
| Header | Beskrivelse |
|---|---|
token |
Din API Secret (for bagudkompatibilitet) |
X-FastComments-Timestamp |
Unix-tidsstempel (sekunder) da anmodningen blev signeret |
X-FastComments-Signature |
HMAC-SHA256-signatur af payloaden |
HMAC-signaturverifikation (Anbefalet)
Vi anbefaler kraftigt at verificere HMAC-signaturen for at sikre, at webhook-payloads er autentiske og ikke er blevet manipuleret med.
Signaturformat: sha256=<hex-encoded-signature>
Hvordan signaturen beregnes:
- Sammenkæd:
timestamp + "." + JSON_payload_body - Beregn HMAC-SHA256 ved at bruge din API Secret som nøgle
- Hex-enkodér resultatet
Eksempel på verifikation (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;
}
// Bekræft at tidsstemplet er nyligt (inden for 5 minutter)
const now = Math.floor(Date.now() / 1000);
if (Math.abs(now - parseInt(timestamp, 10)) > 300) {
return false; // Forebyggelse af replay-angreb
}
// Bekræft signatur
const payload = JSON.stringify(req.body);
const expectedSignature = crypto
.createHmac('sha256', apiSecret)
.update(`${timestamp}.${payload}`)
.digest('hex');
return signature === `sha256=${expectedSignature}`;
}
Eksempel på verifikation (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
# Bekræft at tidsstemplet er nyligt
now = int(time.time())
if abs(now - int(timestamp)) > 300:
return False
# Bekræft signatur
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}"
Eksempel på verifikation (PHP)
function verifyWebhookSignature($headers, $body, $apiSecret) {
$timestamp = $headers['X-FastComments-Timestamp'] ?? null;
$signature = $headers['X-FastComments-Signature'] ?? null;
if (!$timestamp || !$signature) {
return false;
}
// Bekræft at tidsstemplet er nyligt (inden for 5 minutter)
$now = time();
if (abs($now - intval($timestamp)) > 300) {
return false;
}
// Bekræft signatur
$payload = json_encode($body, JSON_UNESCAPED_SLASHES);
$message = $timestamp . '.' . $payload;
$expectedSignature = 'sha256=' . hash_hmac('sha256', $message, $apiSecret);
return hash_equals($expectedSignature, $signature);
}
Ældre autentificering
token-headeren, der indeholder din API Secret, sendes stadig for bagudkompatibilitet. Vi anbefaler dog at migrere til HMAC-verifikation for forbedret sikkerhed, da det beskytter mod replay-angreb.
Hvordan det virker og håndtering af genforsøg 
Alle ændringer af Comment-objektet i systemet udløser en begivenhed, som ender i en kø.
Den indledende webhook-begivenhed sendes normalt inden for seks sekunder efter, at begivenhedskilden indtræffer.
Du kan overvåge denne kø i Webhooks-administrationen i tilfælde af, at din API går ned.
Hvis en anmodning til din API fejler, vil vi sætte den i kø igen efter en tidsplan.
Den tidsplan er 1 Minute * the retry count. Hvis kaldet fejler én gang, forsøger det igen om
et minut. Hvis det fejler to gange, vil det derefter vente to minutter, og så videre. Dette er for at undgå, at vi
overbelaster din API, hvis den går ned på grund af belastning.
Webhooks kan annulleres fra log-siden.
Afslutningsvis
Dette afslutter vores Webhooks-dokumentation.
Vi håber, du synes, at FastComments Webhook-integrationen er nem at forstå og hurtig at sætte op.
Hvis du mener, at du har fundet mangler i vores dokumentation, så lad os det vide nedenfor.