O header X-Jelou-Signature com formato sha256=HMAC_HEX_DIGEST é utilizado em ambas as direções:
- Verificação: Ao receber eventos do Jelou em seu webhook, você deve verificar a assinatura para garantir a integridade.
- Geração: Ao enviar mensagens ao webhook do Jelou (
incoming_message), você deve gerar e enviar a assinatura.
Verificação de eventos recebidos do Jelou
Todos os eventos enviados pelo Jelou ao webhook incluem o header X-Jelou-Signature. Recomenda-se sempre verificar a assinatura.
const crypto = require("crypto");
function verifySignature(payload, signature, signingSecret) {
const expectedSignature = crypto
.createHmac("sha256", signingSecret)
.update(JSON.stringify(payload))
.digest("hex");
const expected = `sha256=${expectedSignature}`;
return (
signature.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))
);
}
Geração de assinatura para enviar ao Jelou
Quando o provedor externo envia uma mensagem ao usuário final via POST /v1/external-support/webhook, deve incluir o header X-Jelou-Signature com a assinatura HMAC-SHA256 do body.
O body assinado deve ser a mesma string exata enviada na requisição. Serialize o payload com JSON.stringify() uma única vez e use essa mesma string tanto para gerar a assinatura quanto para o body da requisição.
const crypto = require("crypto");
const payload = { /* seu payload aqui */ };
const signingSecret = "seu_signing_secret";
const body = JSON.stringify(payload);
const signature = crypto
.createHmac("sha256", signingSecret)
.update(body)
.digest("hex");
console.log("Body (usar como raw body):");
console.log(body);
console.log("\nX-Jelou-Signature:", `sha256=${signature}`);
De acordo com o authType configurado na integração, o Jelou enviará o header correspondente ao invocar seu webhook:
| authType | Header enviado |
|---|
bearer | Authorization: Bearer {{token}} |
api_key | X-API-Key: {{api_key}} |
basic | Authorization: Basic {{base64_credentials}} |
no_auth | Sem header de autenticação |