- Para validar uma solicitação usando a versão mais recente da assinatura do HubSpot, use o cabeçalho
X-HubSpot-Signature-V3e siga as instruções associadas para validar a versão v3 da assinatura. - Para compatibilidade com versões anteriores, as solicitações do HubSpot também incluem versões mais antigas da assinatura. Para validar uma versão mais antiga da assinatura, verifique o cabeçalho
X-HubSpot-Signature-Versione siga as instruções associadas abaixo com base em se a versão év1ouv2.
Validar solicitações usando a assinatura de solicitação v1
Se seu aplicativo estiver inscrito em eventos de objetos do CRM por meio da API do webhooks, as solicitações do HubSpot serão enviadas com o cabeçalhoX-HubSpot-Signature-Version definido como v1. O cabeçalho X-HubSpot-Signature será um hash SHA-256 gerado usando o segredo do cliente do seu aplicativo combinado com detalhes da solicitação.
Para verificar a versão da assinatura, siga as seguintes etapas:
- Crie uma string que concatene o seguinte:
Client secret+request body(se presente). - Crie um hash SHA-256 da string resultante.
- Compare o valor de hash com o valor do cabeçalho
X-HubSpot-Signature:- Se forem iguais, essa solicitação passou na validação.
- Se esses valores forem diferentes, essa solicitação pode ter sido alterada em trânsito ou alguém pode ter falsificado solicitações no seu ponto de extremidade.
Exemplos de assinatura de solicitação v1:
Exemplo em Python
Exemplo em Ruby
Exemplo em Node.js
Exemplo em Java
232db2615f3d666fe21a8ec971ac7b5402d33b9a925784df3ca654d05f4817de
Validar solicitações usando a assinatura de solicitação v2
Se seu aplicativo gerencia dados de uma ação de webhook em um fluxo de trabalho ou se você estiver retornando dados para um cartão de CRM personalizado, a solicitação do HubSpot será enviada com o cabeçalhoX-HubSpot-Signature-Version definido como v2. O cabeçalho X-HubSpot-Signature será um hash SHA-256 gerado usando o segredo do cliente do seu aplicativo combinado com detalhes da solicitação.
Para verificar essa assinatura, execute as seguintes etapas:
- Crie uma string que concatene o seguinte:
Client secret+http method+URI+request body(se presente). - Crie um hash SHA-256 da string resultante.
- Compare o valor do hash à assinatura.
- Se forem iguais, essa solicitação passou na validação.
- Se esses valores forem diferentes, essa solicitação pode ter sido alterada em trânsito ou alguém pode ter falsificado solicitações no seu ponto de extremidade.
- A URI usada para construir a string de origem deve corresponder exatamente à solicitação original, incluindo o protocolo. Se você tiver problemas para validar a assinatura, verifique se todos os parâmetros de consulta estão na mesma ordem em que foram listados na solicitação original.
- A string de origem deve ser de codificado em UTF-8 antes de calcular o hash SHA-256.
Exemplo de uma solicitação GET
Para uma solicitaçãoGET, você precisaria do segredo do cliente do seu aplicativo e de campos específicos dos metadados da sua solicitação. Esses campos estão listados abaixo com valores de espaço reservado incluídos:
- Segredo do cliente:
yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy - Método HTTP:
GET - URI:
https://www.example.com/webhook_uri - Corpo da solicitação:
""
yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyyGEThttps://www.example.com/webhook_uri
Depois de calcular um hash SHA-256 da string concatenada acima, a assinatura resultante que você espera corresponder à do cabeçalho seria: eee2dddcc73c94d699f5e395f4b9d454a069a6855fbfa152e91e88823087200e
Exemplo de uma solicitação POST
Para uma solicitaçãoPOST, você precisaria do segredo do cliente do seu aplicativo, campos específicos dos metadados da sua solicitação e uma representação de string do corpo da solicitação (por exemplo, usando JSON.stringify(request.body) para um serviço Node.js). Esses campos estão listados abaixo com valores de espaço reservado incluídos:
- Segredo do cliente:
yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy - Método HTTP:
POST - URI:
https://www.example.com/webhook_uri - Corpo da solicitação:
{"example_field":"example_value"}
yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyyPOSThttps://www.example.com/webhook_uri{"example_field":"example_value"}
Depois de calcular um hash SHA-256 da string concatenada acima, a assinatura resultante que você espera corresponder à do cabeçalho seria:9569219f8ba981ffa6f6f16aa0f48637d35d728c7e4d93d0d52efaa512af7900
Após fazer um [SHA] da assinatura, você pode então comparar a assinatura esperada resultante com aquela fornecida no cabeçalho x-hubspot-signature da solicitação:
Os trechos de código abaixo detalham como você pode incorporar a validação do pedido v2 para um pedido GET se você estivesse executando um servidor Express para lidar com solicitações de entrada. Lembre-se de que o bloco de código abaixo é um exemplo e omite certas dependências que talvez sejam necessárias para executar um serviço Express completo. Confirme se você está executando as bibliotecas estáveis e seguras mais recentes ao implementar a validação de solicitação para seu serviço específico.
Exemplos de assinatura de solicitação v2:
Exemplo em Node.js
Exemplo em Java
Validar assinaturas de solicitação v3
O cabeçalhoX-HubSpot-Signature-v3 será um hash HMAC SHA-256 gerado usando o segredo do cliente do seu aplicativo combinado com detalhes da solicitação. Também conterá o cabeçalho X-HubSpot-Request-Timestamp.
Ao validar uma solicitação usando o cabeçalho X-HubSpot-Signature-v3, você precisará
- Rejeitar a solicitação se o registro de data/hora tiver mais de 5 minutos.
- Na URI da solicitação, decodificar todos os caracteres codificados por URL listados na tabela abaixo. Você não precisa decodificar o ponto de interrogação que indica o início da string de consulta.
| Valor codificado | Valor decodificado |
|---|---|
%3A | : |
%2F | / |
%3F | ? |
%40 | @ |
%21 | ! |
%24 | $ |
%27 | ' |
%28 | ( |
%29 | ) |
%2A | * |
%2C | , |
%3B | ; |
- Crie uma string com codificação utf-8 que concatene o seguinte:
requestMethod+requestUri+requestBody+ data/hora. O registro de data e hora é fornecido pelo cabeçalhoX-HubSpot-Request-Timestamp. - Crie um hash HMAC SHA-256 da string resultante usando o segredo do aplicativo como o segredo da função HMAC SHA-256.
- A Base64 codifica o resultado da função do HMAC.
- Compare o valor do hash à assinatura. Se forem iguais, a origem da solicitação foi confirmada como sendo da HubSpot. É recomendado usar uma comparação de string de tempo constante para proteger contra ataques de sincronização.
POST se você estivesse executando um serviço de backend para lidar com solicitações recebidas. Tenha em mente que os blocos de código abaixo omitem certas dependências que você pode precisar para executar um serviço de backend completo. Confirme se você está executando as bibliotecas estáveis e seguras mais recentes ao implementar a validação de solicitação para seu serviço específico.