Verificação de Assinatura

Todo webhook enviado pelo Hubpay inclui o header X-Hubpay-Signature com um HMAC-SHA256 do body. Sempre valide antes de processar.

Como funciona

  1. O Hubpay calcula: HMAC-SHA256(body, seu_signing_secret)
  2. Envia no header como v1=<hex>
  3. Você recalcula e compara com comparação de tempo constante (evita timing attack)

Encontre seu Signing Secret em Dashboard → Webhooks → (seu endpoint) → Signing Secret.

Exemplos

javascript
const crypto = require('crypto');

function verifySignature(payload, signature, secret) {
  const expected = 'v1=' + crypto
    .createHmac('sha256', secret)
    .update(payload)
    .digest('hex');

  // Comparação de tempo constante — importante!
  const a = Buffer.from(expected);
  const b = Buffer.from(signature);
  if (a.length !== b.length) return false;
  return crypto.timingSafeEqual(a, b);
}

// Express (body como raw Buffer):
app.post('/webhook', express.raw({ type: '*/*' }), (req, res) => {
  const valid = verifySignature(
    req.body.toString('utf8'),
    req.headers['x-hubpay-signature'],
    process.env.HUBPAY_WEBHOOK_SECRET,
  );
  if (!valid) return res.status(401).send('Invalid signature');

  const event = JSON.parse(req.body);
  console.log('Evento recebido:', event.type);

  res.status(200).send('ok');
});