Формат вебхуков

Вот форматы вебхуков, которые вы получите, если подписались через вебхуки:

Когда инцидент добавлен или обновлён:

{
"meta": {
"unsubscribe": "",
"documentation": ""
},
"page": {
"id": "",
"status_indicator": "",
"status_description": "",
"url": ""
},
"incident": {
"backfilled": false,
"created_at": "",
"impact": "",
"name": "",
"resolved_at": "",
"status": "",
"updated_at": "",
"id": "",
"url": "",
"incident_updates": [
{
"id": "",
"incident_id": "",
"body": "",
"status": "",
"created_at": "",
"updated_at": ""
}
]
}
}

Когда обслуживание добавлено или обновлено:

{
"meta": {
"unsubscribe": "",
"documentation": ""
},
"page": {
"id": "",
"status_indicator": "",
"status_description": "",
"url": ""
},
"maintenance": {
"backfilled": false,
"created_at": "",
"impact": "",
"name": "",
"resolved_at": "",
"status": "",
"updated_at": "",
"id": "",
"url": "",
"duration": "",
"maintenance_updates": [
{
"id": "",
"maintenance_id": "",
"body": "",
"status": "",
"created_at": "",
"updated_at": ""
}
]
}
}

Когда компонент обновлён:

{
"meta": {
"unsubscribe": "https://<status-page-domain>/unsubscribe?id=${subscriber.id}&token=${subscriber.unsubscribeToken}",
"documentation": ""
},
"page": {
"id": "",
"status_indicator": "",
"status_description": "",
"url": ""
},
"component_update": {
"created_at": "",
"new_status": "",
"component_id": ""
},
"component": {
"created_at": "",
"id": "",
"name": "",
"status": ""
}
}

Возможные статусы страницы статуса:

  • UP
  • HASISSUES
  • UNDERMAINTENANCE

Возможные статусы компонента:

  • OPERATIONAL
  • UNDERMAINTENANCE
  • DEGRADEDPERFORMANCE
  • PARTIALOUTAGE
  • MAJOROUTAGE

Возможные статусы инцидента:

  • INVESTIGATING
  • IDENTIFIED
  • MONITORING
  • RESOLVED

Возможные статусы обслуживания:

  • NOTSTARTEDYET
  • INPROGRESS
  • COMPLETED

Проверка полезной нагрузки вебхука

Настоятельно рекомендуется проверять полезную нагрузку вебхука на стороне вашего эндпоинта.

Мы подписываем полезную нагрузку вебхука секретом и передаём подпись в заголовке x-instatus-webhook-signature. Эта подпись позволяет убедиться, что вебхук пришёл от Instatus.

Как проверить вебхук

  1. Сохраните секрет вебхука, сгенерированный при подписке на вебхук (его можно найти при подписке на страницу через вебхук, там же его можно изменить).
Секрет вебхука
  1. Создайте на своём сервере эндпоинт, который будет принимать вебхук.

  2. Сравните полученную подпись с подписью, сгенерированной вашим сервером.

  3. Если подписи совпадают, обработайте вебхук.

Пример кода

import crypto from 'crypto'
import express from 'express'
const app = express()
app.use(express.json())
const WEBHOOK_SECRET = 'your-webhook-secret'
function isVerifiedPayload(payload, signature, secret) {
const hmac = crypto.createHmac('sha256', secret)
const digest = hmac.update(JSON.stringify(payload)).digest('hex')
return crypto.timingSafeEqual(Buffer.from(digest), Buffer.from(signature))
}
app.post('/endpoint/to/webhook', (req, res) => {
const payload = req.body
const signature = req.header('x-instatus-webhook-signature')
if (!signature) {
return res.status(400).send('Signature missing')
}
if (!isVerifiedPayload(payload, signature, WEBHOOK_SECRET)) {
return res.status(401).send('Invalid signature')
}
// Process the valid webhook
res.status(200).send('Webhook received')
})
app.listen(3000, () => console.log('Server running on port 3000'))

Зачем нужна проверка

  • Подтверждает подлинность: гарантирует, что вебхук отправлен нашей платформой.
  • Защищает от подмены: выявляет изменения в полезной нагрузке.
  • Повышает безопасность: защищает от атак повторного воспроизведения и несанкционированного доступа.