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
- O Hubpay calcula:
HMAC-SHA256(body, seu_signing_secret) - Envia no header como
v1=<hex> - 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');
});