ReOTP.
Bảo mật và Đồng bộ hóa/Webhooks và HMAC
1 Phút đọc

Webhooks và HMAC

Tìm hiểu cách nhận thông báo thời gian thực an toàn khi số điện thoại được xác minh.

Webhook là cách nhanh nhất và an toàn nhất để biết rằng người dùng đã xác minh thành công mà không cần thực hiện SSE (Server-Sent Events) (kiểm tra liên tục).

Khi người dùng gửi tin nhắn và được khớp thành công, hệ thống của chúng tôi sẽ gửi yêu cầu POST đến URL mà bạn đã định nghĩa trước trong cài đặt dự án.

Bảo mật Webhook (Chữ ký HMAC)

Để đảm bảo các yêu cầu thực sự đến từ máy chủ của chúng tôi chứ không phải các cuộc tấn công giả mạo, chúng tôi ký mọi yêu cầu bằng thuật toán HMAC-SHA256.

1. Đi tới cài đặt dự án và tạo Webhook Secret.

2. Một chữ ký được mã hóa sẽ được đính kèm trong tiêu đề yêu cầu (Header) có tên là x-webhook-signature.

3. Trên máy chủ của bạn, bạn phải tính toán chữ ký bằng chính Secret của mình và so sánh nó với chữ ký được gửi.

Mã tích hợp (SDKs)
const express = require('express');
const crypto = require('crypto');
const app = express();

const WEBHOOK_SECRET = process.env.REOTP_WEBHOOK_SECRET;
app.use(express.json());

app.post('/webhook/reotp', (req, res) => {
  const signatureHeader = req.headers['x-webhook-signature'];
  const payloadString = JSON.stringify(req.body);

  const expectedSignature = crypto
    .createHmac('sha256', WEBHOOK_SECRET)
    .update(payloadString)
    .digest('hex');

  if (signatureHeader !== expectedSignature) {
    return res.status(401).send('Invalid signature');
  }

  const { event, phoneNumber, requestId } = req.body;
  if (event === 'verification.success') {
    console.log(`User ${phoneNumber} verified! (ID: ${requestId})`);
  }

  res.status(200).send('OK');
});

app.listen(3000, () => console.log('Listening for Webhooks...'));