ReOTP.
Segurança e Sincronização/Webhooks e HMAC
1 min read

Webhooks e HMAC

Saiba como receber notificações instantâneas e seguras ao validar um número de telefone.

Os Webhooks são a maneira mais rápida e segura de saber que um usuário realizou a verificação com sucesso, sem a necessidade de fazer Polling (consultas constantes).

Quando o usuário envia a mensagem e ela é validada, nosso sistema envia uma requisição POST para uma URL que você define previamente nas configurações do projeto.

Segurança do Webhook (Assinatura HMAC)

Para garantir que as requisições venham realmente de nossos servidores e não sejam ataques falsos, assinamos cada requisição usando o algoritmo HMAC-SHA256.

1. Vá para as configurações do projeto e gere um Webhook Secret.

2. Uma assinatura criptografada será incluída no cabeçalho (Header) da requisição como x-webhook-signature.

3. Em seu servidor, você deve calcular a assinatura usando o seu Secret e compará-la com a assinatura recebida.

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