База знаний/Интеграции

Webhook receiver template

Шаблон сервиса, который принимает webhook от Unimoni и проверяет подпись.

Node.js / Express

import crypto from 'crypto';
import express from 'express';

const SECRET = process.env.UNIMONI_WEBHOOK_SECRET;
const app = express();

app.post('/webhook', express.text({ type: 'application/json' }), (req, res) => {
  const ts = req.header('X-Unimoni-Timestamp');
  const sig = req.header('X-Unimoni-Signature');
  if (!ts || !sig) return res.sendStatus(400);

  const skew = Math.abs(Date.now() / 1000 - parseInt(ts, 10));
  if (skew > 300) return res.sendStatus(403);

  const expected = crypto.createHmac('sha256', SECRET).update(ts + '.' + req.body).digest('hex');
  if (!crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected))) {
    return res.sendStatus(403);
  }

  const event = JSON.parse(req.body);
  console.log('Got alert:', event.rule_name, event.state);
  res.sendStatus(200);
});