Formatul webhookurilor

Iată formatul webhookurilor pe care le vei primi dacă te-ai abonat prin webhook:

Când se adaugă sau se actualizează un incident:

{
"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": ""
}
]
}
}

Când se adaugă sau se actualizează o mentenanță:

{
"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": ""
}
]
}
}

Când se actualizează o componentă:

{
"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": ""
}
}

Stări posibile ale paginii de stare:

  • UP
  • HASISSUES
  • UNDERMAINTENANCE

Stări posibile ale componentelor:

  • OPERATIONAL
  • UNDERMAINTENANCE
  • DEGRADEDPERFORMANCE
  • PARTIALOUTAGE
  • MAJOROUTAGE

Stări posibile ale incidentelor:

  • INVESTIGATING
  • IDENTIFIED
  • MONITORING
  • RESOLVED

Stări posibile ale mentenanțelor:

  • NOTSTARTEDYET
  • INPROGRESS
  • COMPLETED

Verificarea payloadului webhook

Este foarte recomandat să validezi payloadul webhook în endpointul tău.

Semnăm payloadurile webhook cu un secret și includem semnătura într-un header numit x-instatus-webhook-signature. Această semnătură îți permite să verifici că webhookul a venit de la Instatus.

Pași pentru verificarea webhookului

  1. Salvează-ți secretul webhook generat când te-ai abonat la webhook (îl găsești când te abonezi prin webhook la o pagină; tot acolo îl poți și personaliza).
Secretul webhookului
  1. Creează pe serverul tău un endpoint nou, care va primi webhookul.

  2. Compară semnătura cu cea generată de serverul tău, ca să o validezi.

  3. Dacă semnăturile corespund, procesează webhookul.

Exemplu de cod

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'))

De ce contează verificarea

  • Asigură autenticitatea: Garantează că webhookul provine de la platforma noastră.
  • Previne modificările: Detectează schimbările aduse payloadului.
  • Crește securitatea: Protejează împotriva atacurilor de tip replay și a accesului neautorizat.