
Језик 🇲🇪 Српски (Црна Гора)
Преглед
Имплементација
Иза кулиса
Са FastComments-ом је могуће позвати API крајњу тачку кад год се коментар дода, ажурира или уклони из нашег система.
Ово постигавамо асинхроним вебхуковима преко HTTP/HTTPS.
Шта су вебхукови 
Вебхук је механизам, или интеграција, између два система где "произвођач" (FastComments) покреће догађај који "потрошач" (Ви) прима путем API позива.
Подржани догађаји и ресурси 
FastComments подржава вебхукове само за ресурс Comment.
Подржавамо вебхукове за креирање, уклањање и ажурирање коментара.
Сваки од њих се у нашем систему сматра посебним догађајем и као такав има различиту семантику и структуру за вебхук догађаје.
Подешавање за локални развој 
За локални развој, користите алат као што је ngrok.
Да бисте поједноставили одржавање безбедности система, локални развој прати исти процес као и подешавање и обезбеђење других окружења.
Корак 1: Додајте "localhost" у домене на вашем налогу.
Додајте "localhost" као домен овде.
Корак 2: Изаберите API кључ
Додаваћемо конфигурацију вебхука за ваш домен, па ће нам бити потребан API кључ. Можете то урадити овде.
Под "Associate with domain" - изаберите ваш "localhost" домен.
НАПОМЕНА: Алтернативно, можете користити један API Secret за сву тест активност и staging окружења. Једноставно додајте API Secret за "All Domains", и дајте му име као "test".
Осигурајте да имате дефинисан API Secret за ваше производне домене. Догађаји за све остале домене користиће wildcard (testing) secret.
Корак 3: Додајте ваш вебхук
Док покрећете ngrok или сличан алат, подесите вредност за "localhost" овде.
When clicking Send Test Payload, we will send two test events to check that you validate the API key.
Once it validates, hit Save.
Корак 4: Додајте коментар
Сада можете додавати, мењати или брисати коментаре и требало би да видите да ћемо позвати вашу локалну машину за развој са догађајима, користећи ваш тестни API кључ. Може бити до 30 секунди кашњења да догађаји не стигну до ваше машине.
Подешавање 
Пратите исте кораке за localhost као и за production. Убедите се да имате подешене production домене и API Secrets.
Прво, идите на Webhooks админ. Ово је доступно преко Управљање подацима -> Webhooks.
Страница за конфигурацију изгледа на следећи начин:
На овој страници можете назначити endpoints за сваку врсту догађаја у вези са коментарима.
За сваку врсту догађаја, обавезно кликните Send Test Payload како бисте били сигурни да сте правилно подесили интеграцију. Погледајте следећи одељак „Тестирање“ за детаље.
Тестирање 
U Webhooks administraciji postoje dugmad Send Test Payload za svaki tip događaja (Kreiranje, Ažuriranje, Brisanje). Događaji Kreiranja i Ažuriranja šalju lažni objekat WebhookComment, dok testiranje Brisanja šalje lažno tijelo zahtjeva sa samo jednim ID-jem.
Provjera payload-ova
Prilikom testiranja vaše webhook integracije, provjerite da dolazni zahtjevi sadrže sljedeća zaglavlja:
token- Vaš API tajni ključX-FastComments-Timestamp- Unix vremenska oznaka (sekunde)X-FastComments-Signature- HMAC-SHA256 potpis
Koristite verifikaciju HMAC potpisa da biste osigurali da su payload-ovi autentični.
Alati za testiranje
Možete koristiti alate kao što su webhook.site ili ngrok da pregledate dolazne webhook payload-ove tokom razvoja.
Tipovi događaja
- Događaj kreiranja: Okida se kada se kreira novi komentar. Zadana metoda: PUT
- Događaj ažuriranja: Okida se kada se komentar izmijeni. Zadana metoda: PUT
- Događaj brisanja: Okida se kada se komentar obriše. Zadana metoda: DELETE
Svaki događaj uključuje kompletne podatke komentara u tijelu zahtjeva (pogledajte Strukture podataka za format payload-a).
Структуре података 
Jedina struktura koja se šalje putem webhook-ova je objekat WebhookComment, prikazan u TypeScript-u ispod.
Struktura objekta WebhookComment
Struktura događaja "Create"
Telo zahteva za događaj "create" je objekat WebhookComment.
Struktura događaja "Update"
Telo zahteva za događaj "update" je objekat WebhookComment.
Struktura događaja "Delete"
Telo zahteva za događaj "delete" je objekat WebhookComment.
Change as of Nov 14th 2023
Previously the "delete" event request body only contained the comment id. It now contains the full comment at the time of deletion.
Run 
When users are tagged in a comment, the information is stored in a list called mentions. Each object in that list
has the following structure.
Run 
HTTP Methods
You can configure the HTTP method for each webhook event type in the admin panel:
- Create Event: POST or PUT (default: PUT)
- Update Event: POST or PUT (default: PUT)
- Delete Event: DELETE, POST, or PUT (default: DELETE)
Since all requests contain an ID, Create and Update operations are idempotent by default (PUT). Repeating the same Create or Update request should not create duplicate objects on your side.
Request Headers
Each webhook request includes the following headers:
| Header | Description |
|---|---|
Content-Type |
application/json |
token |
Vaš API tajni ključ |
X-FastComments-Timestamp |
Unix timestamp (sekunde) kada je zahtev potpisan |
X-FastComments-Signature |
HMAC-SHA256 potpis (sha256=<hex>) |
See Sigurnost i API tokeni for information on verifying the HMAC signature.
Безбедност и API токени 
FastComments webhook захтеви укључују више механизама аутентификације ради безбедности.
Заглавља која се шаљу
| Header | Description |
|---|---|
token |
Ваш API Secret (ради назадне компатибилности) |
X-FastComments-Timestamp |
Unix временска ознака (у секундама) када је захтев потписан |
X-FastComments-Signature |
HMAC-SHA256 потпис података (payload) |
Верификација HMAC потписа (препоручено)
Снажно препоручујемо верификацију HMAC потписа како бисте осигурали да су payload-ови вебхука аутентични и да нису биле измене.
Формат потписа: sha256=<hex-encoded-signature>
Како се потпис израчунава:
- Concatenate:
timestamp + "." + JSON_payload_body - Compute HMAC-SHA256 using your API Secret as the key
- Hex-encode the result
Пример верификације (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;
}
// Потврдите да је временска ознака новија (у року од 5 минута)
const now = Math.floor(Date.now() / 1000);
if (Math.abs(now - parseInt(timestamp, 10)) > 300) {
return false; // Заштита од replay напада
}
// Потврдите потпис
const payload = JSON.stringify(req.body);
const expectedSignature = crypto
.createHmac('sha256', apiSecret)
.update(`${timestamp}.${payload}`)
.digest('hex');
return signature === `sha256=${expectedSignature}`;
}
Пример верификације (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
# Потврдите да је временска ознака новија
now = int(time.time())
if abs(now - int(timestamp)) > 300:
return False
# Потврдите потпис
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}"
Пример верификације (PHP)
function verifyWebhookSignature($headers, $body, $apiSecret) {
$timestamp = $headers['X-FastComments-Timestamp'] ?? null;
$signature = $headers['X-FastComments-Signature'] ?? null;
if (!$timestamp || !$signature) {
return false;
}
// Потврдите да је временска ознака новија (у року од 5 минута)
$now = time();
if (abs($now - intval($timestamp)) > 300) {
return false;
}
// Потврдите потпис
$payload = json_encode($body, JSON_UNESCAPED_SLASHES);
$message = $timestamp . '.' . $payload;
$expectedSignature = 'sha256=' . hash_hmac('sha256', $message, $apiSecret);
return hash_equals($expectedSignature, $signature);
}
Наслеђе аутентификације
Хедер token који садржи ваш API Secret и даље се шаље ради назадне компатибилности. Међутим, препоручујемо миграцију на HMAC верификацију за побољшану безбедност јер штити од replay напада.
Како функционише и руковање поновним покушајима 
Све измјене на Comment објекту у систему покрећу догађај који завршава у реду.
Почетни webhook догађај обично се шаље у року од шест секунди од настанка извора догађаја.
Можете пратити овај ред у Webhooks admin у случају да ваш API престане да ради.
Ако захтјев ка вашем API-ју не успије, ми ћемо га поново ставити у ред према распореду.
Тај распоред је 1 Minute * the retry count. Ако позив не успије једном, покушаће поново за минуту. Ако не успије два пута, онда ће саčekати двије минуте, и тако даље. Ово је да не преоптеретимо ваш API ако он пада због оптерећења.
Webhooks се могу отказати са странице дневника.
У закључку
Ово завршава нашу документацију за Webhooks.
Надамо се да ћете сматрати да је FastComments Webhook интеграција лака за разумјевање и брза за подешавање.
Ако сматрате да сте идентификовали било какве празнине у нашој документацији, обавијестите нас испод.