ReOTP.
セキュリティと同期/ウェブフック (Webhooks) と HMAC
1 分で読めます

ウェブフック (Webhooks) と HMAC

電話番号の検証時に安全なリアルタイム通知を受け取る方法を学びます。

Webhooksは、継続的な検証(SSE: Server-Sent Events)なしでユーザーの検証成功を把握するための最も速くて安全な方法です。

ユーザーがメッセージを送信し、それが正常に一致すると、システムがプロジェクト設定で指定したURLへPOSTリクエストを送ります。

ウェブフックのセキュリティ (HMAC Signature)

リクエストが正当なサーバーから来たかどうかを確認し、偽装攻撃を防ぐため、HMAC-SHA256アルゴリズムで各リクエストに署名します。

1. プロジェクト設定に移動し、Webhook Secretを生成します。

2. 暗号化された署名はリクエストヘッダーにx-webhook-signatureとして添付されます。

3. サーバー側で自分のSecretを使用して署名を計算し、送信された署名と照合する必要があります。

統合コード (SDK)
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...'));