ReOTP.
Keamanan dan Sinkronisasi/Webhook dan HMAC
1 min read

Webhook dan HMAC

Pelajari cara menerima notifikasi instan yang aman saat nomor telepon diverifikasi.

Webhooks adalah cara tercepat dan teraman untuk mengetahui bahwa pengguna berhasil memverifikasi tanpa perlu melakukan Polling (pemeriksaan berkelanjutan).

Ketika pengguna mengirim pesan dan berhasil cocok, sistem kami akan mengirim permintaan POST ke tautan (URL) yang Anda tentukan sebelumnya di pengaturan proyek.

Keamanan Webhook (HMAC Signature)

Untuk memastikan bahwa permintaan benar-benar berasal dari server kami dan bukan serangan palsu, kami menandatangani setiap permintaan menggunakan algoritma HMAC-SHA256.

1. Buka pengaturan proyek dan buat Webhook Secret.

2. Tanda tangan terenkripsi akan dilampirkan dalam header permintaan dengan nama x-webhook-signature.

3. Anda harus menghitung tanda tangan di server Anda menggunakan Secret yang sama dan membandingkannya dengan tanda tangan yang dikirim.

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