
Језик 🇷🇸 Српски
Преглед
Имплементација
Иза кулиса
Са FastComments-ом могуће је позвати API endpoint кад год се коментар дода, ажурира или уклони из нашег система.
Ово остварујемо помоћу асинхроних webhooks преко HTTP/HTTPS.
Шта су вебхукови 
Webhook је механизам, или интеграција, између два система где "произвођач" (FastComments) покреће догађај који "потрошач" (Ви) прима путем API позива.
Подржани догађаји и ресурси 
FastComments подржава вебхукове само за ресурс Comment.
Подржавамо вебхукове за креирање, уклањање и ажурирање коментара.
Сваки од њих се сматра посебним догађајем у нашем систему и као такав има различиту семантику и структуру догађаја вебхука.
Постављање локалног окружења за развој 
За локални развој, користите алат као што је ngrok.
Да би се поједноставило одржавање сигурности система, локални развој прати исти процес као и подешавање и обезбеђивање других окружења.
Корак 1: Додајте "localhost" у домене на вашем налогу.
Додајте "localhost" као домен овде.
Корак 2: Изаберите API кључ
Додаваћемо конфигурацију вебхука за ваш домен, па нам треба API кључ. То можете урадити овде.
У пољу "Associate with domain" - изаберите ваш домен "localhost".
NOTE: Alternatively, you can use one API Secret for all testing activity and staging environments. Simply add an API Secret for "All Domains", and give it a name like "test".
Ensure you have an API Secret defined for your production domain(s). Events for all other domains will use the 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.
Прво, идите на Админ Webhook-ова. Ово је доступно преко Manage Data -> Webhooks.
The configuration page appears as follows:
На овој страници можете да наведете endpoints за сваки тип догађаја везаног за коментаре.
За сваки тип догађаја, обавезно кликните на Send Test Payload да бисте били сигурни да сте правилно подесили вашу интеграцију. Погледајте следећи одељак "Тестирање" за детаље.
Тестирање 
У администраторском интерфејсу Webhooks-а налазе се дугмад Send Test Payload за сваки тип догађаја (Create, Update, Delete). Create и Update догађаји шаљу пример WebhookComment објекта, док тестирање Delete шаље пример тела захтева које садржи само ID.
Верификација садржаја захтева
Када тестирате интеграцију вебхука, проверите да долазни захтеви садрже следећа заглавља:
token- Ваш API секретX-FastComments-Timestamp- Unix временска ознака (у секундама)X-FastComments-Signature- HMAC-SHA256 потпис
Користите верификацију HMAC потписа да бисте осигурали да су подаци аутентични.
Алати за тестирање
Можете користити алате као што су webhook.site или ngrok да прегледате долазне податке вебхука током развоја.
Типови догађаја
- Create Event: Окида се када је креиран нови коментар. Подразумевани метод: PUT
- Update Event: Окида се када је коментар измењен. Подразумевани метод: PUT
- Delete Event: Окида се када је коментар обрисан. Подразумевани метод: DELETE
Сваки догађај укључује целокупне податке коментара у телу захтева (погледајте Структуре података за формат података).
Структуре података 
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.
Promena od 14. novembra 2023.
Ranije je telo zahteva za događaj "delete" sadržavalo samo id komentara. Sada sadrži ceo komentar u trenutku brisanja.
Run 
Kada su korisnici označeni u komentaru, informacije se čuvaju u listi nazvanoj mentions. Svaki objekat u toj listi
ima sledeću strukturu.
Run 
HTTP metode
Možete konfigurisati HTTP metodu za svaki tip webhook događaja u administratorskom panelu:
- Create Event: POST ili PUT (podrazumevano: PUT)
- Update Event: POST ili PUT (podrazumevano: PUT)
- Delete Event: DELETE, POST ili PUT (podrazumevano: DELETE)
Pošto svi zahtevi sadrže ID, Create i Update operacije su idempotentne po podrazumevanoj vrednosti (PUT). Ponavljanje istog Create ili Update zahteva ne bi trebalo da kreira duplikate objekata na vašoj strani.
Zaglavlja zahteva
Svaki webhook zahtev uključuje sledeća zaglavlja:
| Header | Description |
|---|---|
Content-Type |
application/json |
token |
Vaš API Secret |
X-FastComments-Timestamp |
Unix timestamp (sekunde) kada je zahtev potpisan |
X-FastComments-Signature |
HMAC-SHA256 potpis (sha256=<hex>) |
Pogledajte Sigurnost i API tokeni za informacije o verifikaciji HMAC potpisa.
Безбедност и API токени 
FastComments webhook захтеви укључују више механизама аутентификације ради безбедности.
Заглавља која се шаљу
| Заглавље | Опис |
|---|---|
token |
Ваш API Secret (ради уназадне компатибилности) |
X-FastComments-Timestamp |
Unix временска ознака (у секундама) када је захтев потписан |
X-FastComments-Signature |
HMAC-SHA256 потпис payload-а |
Верификација HMAC потписа (Препоручено)
Снажно препоручујемо верификацију HMAC потписа како бисте били сигурни да су webhook payload-ови аутентични и да нису измењени.
Формат потписа: sha256=<hex-encoded-signature>
Како се потпис израчунава:
- Конкатенирајте:
timestamp + "." + JSON_payload_body - Израчунајте HMAC-SHA256 користећи ваш API Secret као кључ
- Хекс-енкодирајте резултат
Пример верификације (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. Ако позив не успе једном, покушаће поново за минут. Ако не успе два пута, онда ће сачекати два минута, и тако даље. Ово је да не бисмо преоптеретили ваш API ако долази до пада услуге због оптерећења.
Webhooks се могу отказати са странице логова.
У закључку
Овим се завршава наша Webhooks документација.
Надамо се да ће вам интеграција FastComments Webhook бити лака за разумевање и брза за подешавање.
Ако сматрате да сте пронашли било какве недостатке у нашој документацији, јавите нам у наставку.