
Језик 🇷🇸 Српски
Преглед
Имплементација
Иза кулиса
Са 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-јем.
Верификација корисности порука
Када тестирате вашу webhook интеграцију, проверите да долазни захтеви садрже следеће заглавља:
token- Ваш API тајни кључX-FastComments-Timestamp- Unix timestamp (у секундама)X-FastComments-Signature- HMAC-SHA256 потпис
Користите проверу HMAC потписа да бисте осигурали да су подаци у порукама аутентични.
Алатке за тестирање
Можете користити алатке као што су webhook.site или ngrok да бисте прегледали долазне webhook payload-ове током развоја.
Врсте догађаја
- Create Event: Покреће се када се креише нови коментар. Подразумевана метода: PUT
- Update Event: Покреће се када се коментар уреди. Подразумевана метода: PUT
- Delete Event: Покреће се када се коментар обрише. Подразумевана метода: DELETE
Сваки догађај укључује све податке коментара у телу захтева (погледајте Структуре података за формат payload-а).
Структуре података 
Једина структура која се шаље преко вебхукова је објекат WebhookComment, описан у TypeScript-у испод.
Структура објекта WebhookComment
Структура догађаја "Create"
Тело захтева за догађај "create" је објекат WebhookComment.
Структура догађаја "Update"
Тело захтева за догађај "update" је објекат WebhookComment.
Структура догађаја "Delete"
Тело захтева за догађај "delete" је објекат WebhookComment.
Промена од 14. новембра 2023.
Пре тога, тело захтева за догађај "delete" садржало је само id коментара. Сада садржи цео коментар у тренутку брисања.
Run 
Када су корисници означени у коментару, информације се чувају у списку који се зове mentions. Сваки објекат у том списку
има следећу структуру.
Run 
HTTP методи
Можете конфигурисати HTTP метод за сваку врсту вебхук догађаја у админ панелу:
- Create догађај: POST или PUT (подразумевано: PUT)
- Update догађај: POST или PUT (подразумевано: PUT)
- Delete догађај: DELETE, POST, или PUT (подразумевано: DELETE)
Пошто сви захтеви садрже ID, операције Create и Update су подразумевано идемпотентне (PUT). Понављање истог Create или Update захтева не би требало да креира дупликат објеката на вашој страни.
Заглавља захтева
Сваки вебхук захтев укључује следећа заглавља:
| Header | Description |
|---|---|
Content-Type |
application/json |
token |
Ваш API тајни кључ |
X-FastComments-Timestamp |
Unix временска ознака (у секундама) када је захтев потписан |
X-FastComments-Signature |
HMAC-SHA256 потпис (sha256=<hex>) |
Погледајте Безбедност и API токени за информације о верификацији HMAC потписа.
Безбедност и 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 бити лака за разумевање и брза за подешавање.
Ако сматрате да сте пронашли било какве недостатке у нашој документацији, јавите нам у наставку.