Verificar a assinatura HMAC do webhook: fazê-lo bem
O que o HMAC prova realmente
O esquema exato que a Olmira usa
X-Aether-Signature, X-Aether-Webhook-Id e X-Aether-Event. (O prefixo do cabeçalho diz Aether e não Olmira — um resto do nome de código interno da plataforma; não afeta em nada o funcionamento do esquema, apenas o nome literal do cabeçalho.)Verificar uma entrega, em termos simples
crypto incorporado do Node cobre tudo isto sem uma única dependência; as verificações prévias abaixo são onde as implementações corretas realmente se distinguem das avariadas.Os erros que fazem falhar a verificação
. — é a segunda mais comum, e é fácil de cometer porque o corpo é a coisa mais «óbvia» a que fazer hash.Antes de confiar nisso em produção
Verifique primeiro a janela de data e hora
Rejeite tudo o que estiver fora de uma tolerância pequena (a Olmira publica 300 segundos, cinco minutos, como o seu próprio valor de referência) antes de gastar tempo de CPU a calcular hashes — uma assinatura fora de prazo não merece a comparação.
Compare em tempo constante
Use a primitiva de comparação em tempo constante da sua linguagem, e não uma simples verificação de igualdade, para que uma divergência nunca revele, pelo tempo, quão perto esteve uma tentativa.
Confirme que está a aplicar hash ao corpo em bruto
Registe pelo menos uma vez, durante a configuração, a string exata que o seu código está prestes a passar por hash e compare-a, byte a byte, com o que uma entrega de teste enviou de facto.
Preveja a rotação da chave secreta
Onde quer que guarde o segredo, faça com que alterá-lo seja uma mudança de configuração de uma linha — rodá-lo no painel sem o atualizar no mesmo momento faz com que todas as entregas comecem a falhar até que se ponha em dia.
Como a Olmira trata disto
Leitura relacionada
Os IP de origem mudam — por trás de balanceadores de carga, com alterações de infraestrutura do fornecedor, ao longo do tempo — e colocá-los numa lista de permissões revela-se frágil na prática. Uma assinatura criptográfica prova a autenticidade independentemente do caminho de rede, o que é uma garantia mais forte e mais estável do que «o pedido veio de uma gama que hoje reconhecemos».
Não — o esquema é idêntico em todo o lado. O que difere por endpoint é apenas o segredo em si, uma vez que cada um é gerado de forma independente.
Não — verifique a assinatura, confirme a receção depressa e faça depois, de forma assíncrona, tudo o que for lento (escritas na base de dados, chamadas a outros sistemas). Um emissor de webhooks cujo tempo de espera pelo seu endpoint expire trata isso, em geral, como uma falha e volta a tentar — e não convém provocar isso por lentidão em vez de por uma falha real.
Rejeite antes de processar seja o que for — uma resposta 4xx e mais nada. Não descreva no corpo da resposta porquê falhou; um atacante que sonde o seu endpoint não deve receber informação gratuita sobre que parte de uma assinatura forjada estava errada.