К содержанию
БазаДокументация

Вебхуки

Проверка подписи

Каждый запрос подписан HMAC-SHA256 от rawBody с секретом вебхука. Подпись приходит в X-Bazabaza-Signature с префиксом sha256=.

Каждый запрос подписан HMAC-SHA256 от rawBody с секретом вебхука. Подпись приходит в X-Bazabaza-Signature с префиксом sha256=.

Алгоритм проверки

  1. Возьмите сырое тело запроса

    Именно байты, полученные по сети, без пересоздания JSON.
  2. Вычислите HMAC

    SHA-256 от сырого тела с секретом вебхука.
  3. Сравните безопасно

    Функцией с постоянным временем, с префиксом 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) даст другую подпись.