
Мова 🇺🇦 Українська
Огляд
Реалізація
За лаштунками
За допомогою FastComments можна викликати кінцеву точку API щоразу, коли коментар додається, оновлюється або видаляється з нашої системи.
Ми реалізуємо це за допомогою асинхронних вебхуків через HTTP/HTTPS.
Що таке вебхуки 
Вебхук — це механізм або інтеграція між двома системами, де "виробник" (FastComments) ініціює подію яку "споживач" (Ви) обробляє через виклик API.
Підтримувані події та ресурси 
FastComments підтримує вебхуки лише для ресурсу Comment.
Ми підтримуємо вебхуки для створення коментаря, видалення та оновлення.
Кожен із цих випадків вважається окремою подією в нашій системі і тому має різну семантику та структуру подій вебхука.
Налаштування локальної розробки 
Для локальної розробки використовуйте інструмент на кшталт ngrok.
Щоб спростити підтримку безпеки системи, локальна розробка слідує тому ж процесу, що й налаштування та захист інших середовищ.
Step 1: Add "localhost" to domains in your account.
Додайте "localhost" як домен тут.
Step 2: Pick an API Key
Ми будемо додавати конфігурацію webhook для вашого домену, тому нам знадобиться API key. Ви можете зробити це тут.
Під «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".
Переконайтесь, що у вас визначено API Secret для ваших продукційних доменів. Події для всіх інших доменів використовуватимуть загальний (тестовий) секрет.
Step 3: Add Your Webhook
Поки запущено ngrok або подібний інструмент, встановіть значення для "localhost" тут.
When clicking Send Test Payload, ми надішлемо два тестові події, щоб перевірити, що ви валідируєте API key.
Після успішної валідації натисніть Save.
Step 4: Add A Comment
Тепер ви можете додавати, редагувати або видаляти коментарі та повинні побачити, як ми викликаємо вашу локальну машину розробника цими подіями, використовуючи ваш тестовий API key. Може бути затримка до 30 секунд щоб події дісталися до вашої машини.
Налаштування 
Виконайте ті самі кроки для localhost, що й для production. Переконайтеся, що у вас налаштовані production domains та API Secrets.
Спочатку перейдіть до Webhooks admin. Це доступно через Manage Data -> Webhooks.
The configuration page appears as follows:
На цій сторінці ви можете вказати endpoints для кожного типу події коментаря.
Для кожного типу подій обов'язково натискайте Send Test Payload, щоб переконатися, що інтеграція налаштована правильно. Деталі див. у наступному розділі "Testing".
Тестування 
В адмінці Webhooks є кнопки Send Test Payload для кожного типу подій (Create, Update, Delete). Події Create та Update відправляють демонстраційний об'єкт WebhookComment, тоді як при тестуванні Delete буде надіслано тестове тіло запиту, що містить лише ID.
Перевірка вхідних даних
Під час тестування інтеграції вебхуків переконайтеся, що вхідні запити містять наступні заголовки:
token- Ваш секрет APIX-FastComments-Timestamp- Unix-мітка часу (у секундах)X-FastComments-Signature- підпис HMAC-SHA256
Використовуйте перевірку підпису HMAC, щоб переконатися в автентичності вхідних даних.
Інструменти для тестування
Ви можете використовувати інструменти, такі як webhook.site або ngrok, щоб переглядати вхідні дані вебхуків під час розробки.
Типи подій
- Create Event: Викликається, коли створюється новий коментар. Метод за замовчуванням: PUT
- Update Event: Викликається, коли коментар редагується. Метод за замовчуванням: PUT
- Delete Event: Викликається, коли коментар видаляється. Метод за замовчуванням: DELETE
Кожна подія містить повні дані коментаря в тілі запиту (див. Структури даних для формату даних).
Структури даних 
Єдина структура, яку надсилають через вебхуки — це об'єкт WebhookComment, описаний нижче на TypeScript.
Структура об'єкта WebhookComment
The "Create" Event Structure
Тіло запиту події "create" є об'єктом WebhookComment.
The "Update" Event Structure
Тіло запиту події "update" є об'єктом WebhookComment.
The "Delete" Event Structure
Тіло запиту події "delete" є об'єктом 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
Ви можете налаштувати HTTP-метод для кожного типу подій вебхука в адмін-панелі:
- Create Event: POST або PUT (за замовчуванням: PUT)
- Update Event: POST або PUT (за замовчуванням: PUT)
- Delete Event: DELETE, POST, або PUT (за замовчуванням: DELETE)
Оскільки всі запити містять ID, операції Create та Update за замовчуванням ідемпотентні (PUT). Повторне надсилання того ж запиту Create або Update не має створювати дублікати об'єктів у вас.
Request Headers
Кожний запит вебхука містить такі заголовки:
| Header | Description |
|---|---|
Content-Type |
application/json |
token |
Ваш API Secret |
X-FastComments-Timestamp |
Unix-мітка часу (секунди), коли запит було підписано |
X-FastComments-Signature |
Підпис HMAC-SHA256 (sha256=<hex>) |
See Безпека та API токени for information on verifying the HMAC signature.
Безпека та API-токени 
FastComments webhook requests include multiple authentication mechanisms for security.
Headers Sent
| Header | Description |
|---|---|
token |
Your API Secret (for backwards compatibility) |
X-FastComments-Timestamp |
Unix timestamp (seconds) when the request was signed |
X-FastComments-Signature |
HMAC-SHA256 signature of the payload |
HMAC Signature Verification (Recommended)
We strongly recommend verifying the HMAC signature to ensure webhook payloads are authentic and haven't been tampered with.
Signature Format: sha256=<hex-encoded-signature>
How the signature is computed:
- Concatenate:
timestamp + "." + JSON_payload_body - Compute HMAC-SHA256 using your API Secret as the key
- Hex-encode the result
Example Verification (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 attacks)
}
// Перевірка підпису
const payload = JSON.stringify(req.body);
const expectedSignature = crypto
.createHmac('sha256', apiSecret)
.update(`${timestamp}.${payload}`)
.digest('hex');
return signature === `sha256=${expectedSignature}`;
}
Example Verification (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}"
Example Verification (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);
}
Legacy Authentication
The token header containing your API Secret is still sent for backwards compatibility. However, we recommend migrating to HMAC verification for improved security as it protects against replay attacks.
Як це працює та обробка повторних спроб 
Усі зміни об'єкта Comment у системі викликають подію, яка потрапляє в чергу.
Початковий вебхук зазвичай надсилається протягом шести секунд після виникнення джерела події.
Ви можете відстежувати цю чергу в панелі адміністрування Webhooks на випадок, якщо ваш API вийде з ладу.
Якщо запит до вашого API не вдається, ми повторно помістимо його в чергу за певним графіком.
Цей графік — 1 Minute * the retry count. Якщо виклик не вдається один раз, він спробує ще раз через
хвилину. Якщо він не вдасться двічі, тоді зачекає дві хвилини, і так далі. Це зроблено для того, щоб ми
не перевантажували ваш API, якщо він виходить з ладу з причин, пов'язаних з навантаженням.
Вебхуки можна скасувати на сторінці журналу.
На завершення
Цим завершується наша документація Webhooks.
Ми сподіваємося, що інтеграція FastComments Webhook є зрозумілою та швидкою у налаштуванні.
Якщо ви вважаєте, що виявили будь-які прогалини в нашій документації, повідомте нас нижче.