# Thông báo qua Webhook

Source: https://instatus.com/help/vi/status-page/notifications/webhook

## Thêm người đăng ký webhook

Đăng nhập vào Instatus tại [instatus.com/login](https://dashboard.instatus.com/login) rồi chọn trang trạng thái của bạn.

Vào **Người đăng ký**, rồi **Webhook**.

Nhấp **Thêm người đăng ký webhook**,

Một biểu mẫu mới sẽ hiện ra, tại đó bạn có thể nhập:

- URL webhook
- Địa chỉ email

![Người đăng ký webhook](https://instatus.com/help/notification/webhook1.png)

Chúng tôi sẽ gửi các yêu cầu tới URL của bạn theo [định dạng này](https://instatus.com/help/vi/webhooks)
và một email sẽ được gửi tới địa chỉ email đã chỉ định khi URL gặp vấn đề.

Bạn có thể đặt tên cho người đăng ký webhook bằng cách nhấp vào nó và nhập tên trong biểu mẫu; bạn cũng có thể xóa người đăng ký này bằng cách nhấp Hủy đăng ký.

## Xác minh payload của Webhook

**Rất khuyến khích xác thực payload của webhook tại endpoint webhook.**

Chúng tôi ký payload webhook bằng một secret và đính kèm chữ ký trong một header tên là `x-instatus-webhook-signature`. Chữ ký này cho phép bạn xác minh rằng webhook đến từ Instatus.

### Các bước xác minh Webhook

1. Lấy **Webhook Secret** của bạn từ dashboard (Bạn có thể tìm thấy nó khi sửa hoặc tạo một webhook, và cũng có thể tùy chỉnh nó tại đó).

![Webhook Secret](https://instatus.com/help/notification/webhook-secret-example.png)

2. Tạo một endpoint mới trên máy chủ của bạn để nhận webhook.

3. So sánh chữ ký với chữ ký do máy chủ của bạn tạo ra để xác thực.

4. Nếu hai chữ ký khớp nhau, hãy xử lý webhook.

#### Ví dụ mã

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

### Vì sao việc xác minh quan trọng

- **Đảm bảo tính xác thực**: Bảo đảm webhook thực sự đến từ nền tảng của chúng tôi.
- **Ngăn chặn giả mạo**: Phát hiện các thay đổi trong payload.
- **Tăng cường bảo mật**: Bảo vệ trước các cuộc tấn công phát lại và truy cập trái phép.

- [Thông báo qua X](https://instatus.com/help/vi/status-page/notifications/x): Tìm hiểu cách gửi thông báo qua X.
