ReOTP.
安全与同步/Webhooks 与 HMAC
1 阅读需1分钟

Webhooks 与 HMAC

了解如何在验证手机号码时接收安全的实时通知。

Webhooks 是了解用户已成功验证的最快、最安全的方式,无需进行 SSE (Server-Sent Events)(持续轮询)。

当用户发送消息并成功匹配时,我们的系统会向您预先在项目设置中指定的 URL 发送一个 POST 请求。

Webhook 安全性 (HMAC 签名)

为了确保请求确实来自我们的服务器而不是伪造的攻击,我们使用 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 = '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...'));