ReOTP.
Bảo mật & Đồng bộ/Webhook & HMAC
1 min read

Webhook & HMAC

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

Webhook là cách nhanh nhất, an toàn nhất để biết người dùng đã xác thực thành công mà không cần Polling (kiểm tra liên tục).

Khi người dùng gửi tin và khớp thành công, hệ thống gửi yêu cầu POST đến URL bạn cấu hình trước trong cài đặt dự án.

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

Để đảm bảo yêu cầu thực sự từ máy chủ chúng tôi, không phải 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. Vào Cài đặt dự án và tạo Webhook Secret.

2. Chữ ký mã hóa sẽ đính kèm trong Header tên x-webhook-signature.

3. Trên máy chủ của bạn, hãy tính chữ ký dùng Secret của bạn và so sánh với chữ ký nhận được.

Integration Code (SDKs)
const express = require('express');
const crypto = require('crypto');
const app = express();

const WEBHOOK_SECRET = 'your_webhook_secret_here';

// Must parse raw body to verify signature correctly
app.use(express.json());

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

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

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

  // Handle successful verification
  const { event, phoneNumber, requestId } = req.body;
  if (event === 'verification.success') {
    console.log(`User ${phoneNumber} verified! (ID: ${requestId})`);
    // Login user, create session, update DB, etc.
  }

  // Must return 200 OK so we know it was delivered
  res.status(200).send('OK');
});

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