Вебхуки
Проверка подписи
Каждый запрос подписан HMAC-SHA256 от rawBody с секретом вебхука. Подпись приходит в X-Bazabaza-Signature с префиксом sha256=.
Каждый запрос подписан HMAC-SHA256 от rawBody с секретом вебхука. Подпись приходит в X-Bazabaza-Signature с префиксом sha256=.
Алгоритм проверки
Возьмите сырое тело запроса
Именно байты, полученные по сети, без пересоздания JSON.Вычислите HMAC
SHA-256 от сырого тела с секретом вебхука.Сравните безопасно
Функцией с постоянным временем, с префиксомsha256=.
#Пример на PHP
php
$raw = file_get_contents('php://input');
$expected = 'sha256=' . hash_hmac('sha256', $raw, $webhookSecret);
$header = $_SERVER['HTTP_X_BAZABAZA_SIGNATURE'] ?? '';
if (!hash_equals($expected, $header)) {
http_response_code(401);
exit('bad signature');
}#Пример на Node.js (Express)
js
const crypto = require('crypto');
app.post('/hook', (req, res) => {
const raw = req.rawBody; // must be the original body string
const expected = 'sha256=' + crypto
.createHmac('sha256', WEBHOOK_SECRET)
.update(raw)
.digest('hex');
const ok = crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(req.headers['x-bazabaza-signature'] || ''),
);
if (!ok) return res.status(401).end();
const { event, data, at } = req.body;
// обработайте событие, верните 2xx
res.status(200).end();
});Не пересоздавайте JSON
Подпись считается от
rawBody — строки как она пришла. Пересериализация тела через JSON.stringify(req.body) даст другую подпись.