
Језик 🇷🇸 Српски
Преглед
Имплементација
Иза кулиса
Вебхукови
Са FastComments-ом могуће је позвати API endpoint кад год се коментар дода, ажурира или уклони из нашег система.
Ово остварујемо помоћу асинхроних webhooks преко HTTP/HTTPS.
Шта су вебхукови 
Webhook је механизам, или интеграција, између два система где "произвођач" (FastComments) покреће догађај који "потрошач" (Ви) прима путем API позива.
Подржани догађаји и ресурси 
FastComments подржава вебхукове само за ресурс Comment.
Подржавамо вебхукове за креирање, уклањање и ажурирање коментара.
Сваки од њих се сматра посебним догађајем у нашем систему и као такав има различиту семантику и структуру догађаја вебхука.
Постављање локалног окружења за развој 
За локални развој, користите алат као што је ngrok.
Да би се олакшало одржавање безбедности система, локални развој прати исти процес као постављање и обезбеђивање других окружења.
Корак 1: Додајте „localhost“ у домене у вашем налогу.
Додајте „localhost“ као домен овде.
Корак 2: Одаберите API кључ
Додаћемо конфигурацију вебхука за ваш домен, па нам је потребан API кључ. То можете урадити овде.
Под „Associate with domain“ - изаберите ваш домен „localhost“.
НАПОМЕНА: Алтернативно, можете користити једну API тајну за све тестирање и сценичка окружења. Само додајте API тајну за „All Domains“ и дајте јој име као што је „test“.
Уверите се да имате дефинисану API тајну за ваше продукционе домене. Догађаји за све друге домене користиће wildcard (тест) тајну.
Корак 3: Додајте ваш вебхук
Док користите ngrok или сличан алат, поставите вредност за „localhost“ овде.
Када кликнете Send Test Payload, послаћемо два тестна догађаја да проверимо да ли сте валидарали API кључ.
Када се валидација успе, кликните Save.
Корак 4: Додајте коментар
Сада можете да додајете, уређујете или бришете коментаре и требало би да видите да ваш локални развојни рачунар прима догађаје, користећи ваш тестни API кључ. Може постоји до 30 секунди кашњења док догађаји стигну до вашег рачунара.
Постављање 
Пратите исте кораке за localhost као и за продукцију. Уверите се да су продукциони домени и API тајне подешени.
Прво, идите на Webhooks admin. Ово је доступно преко Manage Data -> Webhooks.
Страница за конфигурацију се приказује као што следи:
На овој страници можете одредити крајње тачке за сваку врсту догађаја коментара.
За сваку врсту догађаја, обавезно кликните Пошаљи тестни податак да бисте били сигурни да сте интеграцију правилно подесили. Погледајте следећи одељак, "Тестирање", за детаље.
Тестирање 
У администрацији 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 бити лака за разумевање и брза за подешавање.
Ако сматрате да сте пронашли било какве недостатке у нашој документацији, јавите нам у наставку.