Validar solicitações da HubSpot

 

Para garantir que as solicitações que sua integração esteja recebendo da HubSpot venham realmente da HubSpot, preenchemos dois cabeçalhos: X-HubSpot-Signature e X-HubSpot-Signature-Version.

O cabeçalho X-HubSpot-Signature conterá a assinatura que precisará ser verificada. O método usado para verificar a assinatura dependerá da versão da assinatura.

O cabeçalho X-HubSpot-Signature-Version conterá um número de versão, ou seja, v2, que indicará qual método deve ser usado para verificar a assinatura incluída no X-HubSpot-Signature.

Veja as páginas de documentação abaixo para obter detalhes sobre como verificar as diferentes versões da assinatura.


Validar a solicitação de solicitação v1:

Quando a solicitação da HubSpot for enviada com o cabeçalho X-HubSpot-Signature-Version definido como v1, o cabeçalho X-HubSpot-Signature será um hash SHA-256 criado usando o segredo do cliente do seu aplicativo combinado com dados da solicitação.

Para verificar essa assinatura, execute as seguintes etapas:

  • Crie uma cadeia que concatene o seguinte: Segredo do cliente corpo da solicitação (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 endpoint.

Exemplo de uma solicitação com um corpo:

//Client secret : yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy // Request body: [ {"eventId":1,"subscriptionId":12345," portalId":62515", occurredAt":1564113600000", subscriptionType":"contact.creation", "attemptNumber":0, "objectId":123, "changeSource":"CRM", "changeFlag":"NEW", "appId":54321} ]

Exemplos de assinatura de solicitação v1: 

NOTE: This is only an example for generating the expected hash. You will need to compare this expected hash with the actual hash in the X-HubSpot-Signature header. >>> import hashlib >>> client_secret = 'yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy' >>> request_body = '[{"eventId":1,"subscriptionId":12345,"portalId":62515,"occurredAt":1564113600000,"subscriptionType":"contact.creation","attemptNumber":0,"objectId":123,"changeSource":"CRM","changeFlag":"NEW","appId":54321}]' >>> source_string = client_secret + request_body >>> source_string 'yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy[{"eventId":1,"subscriptionId":12345,"portalId":62515,"occurredAt":1564113600000,"subscriptionType":"contact.creation","attemptNumber":0,"objectId":123,"changeSource":"CRM","changeFlag":"NEW","appId":54321}]' >>> hashlib.sha256(source_string).hexdigest() '232db2615f3d666fe21a8ec971ac7b5402d33b9a925784df3ca654d05f4817de' NOTE: This is only an example for generating the expected hash. You will need to compare this expected hash with the actual hash in the X-HubSpot-Signature header. irb(main):003:0> require 'digest' => true irb(main):004:0> client_secret = 'yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy' => "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy" irb(main):005:0> request_body = '[{"eventId":1,"subscriptionId":12345,"portalId":62515,"occurredAt":1564113600000,"subscriptionType":"contact.creation","attemptNumber":0,"objectId":123,"changeSource":"CRM","changeFlag":"NEW","appId":54321}]' => "[{\"eventId\":1,\"subscriptionId\":12345,\"portalId\":62515,\"occurredAt\":1564113600000,\"subscriptionType\":\"contact.creation\",\"attemptNumber\":0,\"objectId\":123,\"changeSource\":\"CRM\",\"changeFlag\":\"NEW\",\"appId\":54321}]" irb(main):006:0> source_string = client_secret + request_body => "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy[{\"eventId\":1,\"subscriptionId\":12345,\"portalId\":62515,\"occurredAt\":1564113600000,\"subscriptionType\":\"contact.creation\",\"attemptNumber\":0,\"objectId\":123,\"changeSource\":\"CRM\",\"changeFlag\":\"NEW\",\"appId\":54321}]" irb(main):007:0> Digest::SHA256.hexdigest source_string => "232db2615f3d666fe21a8ec971ac7b5402d33b9a925784df3ca654d05f4817de" NOTE: This is only an example for generating the expected hash. You will need to compare this expected hash with the actual hash in the X-HubSpot-Signature header. > const crypto = require('crypto') undefined > client_secret = 'yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy' 'yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy' > request_body = '[{"eventId":1,"subscriptionId":12345,"portalId":62515,"occurredAt":1564113600000,"subscriptionType":"contact.creation","attemptNumber":0,"objectId":123,"changeSource":"CRM","changeFlag":"NEW","appId":54321}]' '[{"eventId":1,"subscriptionId":12345,"portalId":62515,"occurredAt":1564113600000,"subscriptionType":"contact.creation","attemptNumber":0,"objectId":123,"changeSource":"CRM","changeFlag":"NEW","appId":54321}]' > source_string = client_secret + request_body 'yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy[{"eventId":1,"subscriptionId":12345,"portalId":62515,"occurredAt":1564113600000,"subscriptionType":"contact.creation","attemptNumber":0,"objectId":123,"changeSource":"CRM","changeFlag":"NEW","appId":54321}]' > hash = crypto.createHash('sha256').update(source_string).digest('hex') '232db2615f3d666fe21a8ec971ac7b5402d33b9a925784df3ca654d05f4817de'

O hash resultante seria:
232db2615f3d666fe21a8ec971ac7b5402d33b9a925784df3ca654d05f4817de


Validando a solicitação de solicitação v2:

Quando a solicitação da HubSpot for enviada com o cabeçalho X-HubSpot-Signature-Version definido como v2, o cabeçalho X-HubSpot-Signature será um hash SHA-256 criado usando o segredo do cliente do seu aplicativo combinado com dados da solicitação.

Para verificar essa assinatura, execute as seguintes etapas:

  • Crie uma cadeia que concatene o seguinte: Segredo do cliente + método http + URI + corpo da solicitação (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 endpoint.

    Observações:
    • 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:



Exemplo de uma solicitação com um corpo:

  • Segredo do cliente: yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy
  • Método HTTP: POST
  • URIhttps://www.example.com/webhook_uri
  • Corpo da solicitação: {"example_field":"example_value"} 

 

Validar as assinaturas de solicitação v3

Quando a solicitação da HubSpot for enviada com o cabeçalho X-HubSpot-Signature-Version definido como v3, o cabeçalho X-HubSpot-Signature será um hash SHA-256 criado usando o segredo do cliente do seu aplicativo combinado com dados da solicitação. Ela também conterá o cabeçalho X-HubSpot-Request-Timestamp.
  • Rejeitar a solicitação se o registro de data/hora tiver mais de 5 minutos.
  • Crie uma string codificada em utf-8 que concatene o seguinte: requestMethod + requestUri + requestBody + timestamp. O registro de data e hora é fornecido pelo cabeçalho X-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. Recomendamos usar uma comparação de string de tempo constante para a proteção contra ataques de sincronização.

Was this article helpful? *
This form is used for documentation feedback only. Learn how to get help with HubSpot...