ReOTP.
ความปลอดภัยและการซิงโครไนซ์/เว็บฮุก (Webhooks) และ HMAC
1 นาทีในการอ่าน

เว็บฮุก (Webhooks) และ HMAC

เรียนรู้วิธีรับการแจ้งเตือนแบบเรียลไทม์ที่ปลอดภัยเมื่อมีการยืนยันหมายเลขโทรศัพท์

Webhooks เป็นวิธีที่เร็วและปลอดภัยที่สุดในการทราบว่าผู้ใช้ทำการยืนยันสำเร็จแล้ว โดยไม่ต้องทำ SSE (Server-Sent Events) (การตรวจสอบอย่างต่อเนื่อง)

เมื่อผู้ใช้ส่งข้อความและได้รับการจับคู่สำเร็จ ระบบของเราจะส่งคำขอ POST ไปยัง URL ที่คุณกำหนดไว้ล่วงหน้าในการตั้งค่าโปรเจกต์

ความปลอดภัยของเว็บฮุก (HMAC Signature)

เพื่อให้แน่ใจว่าคำขอมาจากเซิร์ฟเวอร์ของเราจริงๆ และไม่ใช่การโจมตีปลอม เราจึงลงชื่อในทุกคำขอด้วยอัลกอริทึม HMAC-SHA256

1. ไปที่การตั้งค่าโปรเจกต์และสร้าง Webhook Secret

2. ลายเซ็นที่เข้ารหัสจะถูกแนบมาในส่วนหัวของคำขอ (Header) ในชื่อ x-webhook-signature

3. คุณต้องคำนวณลายเซ็นบนเซิร์ฟเวอร์ของคุณโดยใช้ Secret เดียวกันและเปรียบเทียบกับลายเซ็นที่ส่งมา

โค้ดสำหรับการเชื่อมต่อ (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...'));