Validation des demandes par HubSpot

 

Pour vérifier que les demandes que votre intégration reçoit de HubSpot proviennent bien de HubSpot, nous fournissons deux en-têtes : X-HubSpot-Signature et X-HubSpot-Signature-Version.

L'en-tête X-HubSpot-Signature contient la signature qui devra être vérifiée. La méthode utilisée pour vérifier la signature dépend de la version de la signature.

L'en-tête X-HubSpot-Signature-Version contient un numéro de version, c'est-à-dire v2, qui indique la méthode utilisée pour vérifier la signature incluse dans X-HubSpot-Signature.

Consultez les pages de documentation ci-dessous pour en savoir plus sur la vérification des différentes versions de la signature.


Validation de la signature de demande v1 :

Lorsque la demande de HubSpot est envoyée avec l'en-tête X-HubSpot-Signature-Version défini sur v1, l'en-tête X-HubSpot-Signature sera un hachage SHA-256 conçu à l'aide du secret de client de votre application associé à des détails de la demande.

Pour vérifier cette signature, effectuez les étapes suivantes :

  • Créez une chaîne qui regroupe les éléments suivants : clientSecret requestBody (le cas échéant)
  • Créez un hachage SHA-256 de la chaîne résultante.
  • Comparez la valeur de hachage à la signature.
    • Si elle est égale, cette demande a été validée.
    • Si ces valeurs sont différentes, cette demande peut avoir été modifiée en transit ou quelqu'un peut usurper les demandes à votre point de terminaison.

Exemple de demande avec un corps :

//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} ]

Exemples de signatures de demande 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'

Le hachage résultant serait :
232db2615f3d666fe21a8ec971ac7b5402d33b9a925784df3ca654d05f4817de


Validation de la signature de demande v2 :

Lorsque la demande de HubSpot est envoyée avec l'en-tête X-HubSpot-Signature-Version défini sur v2, l'en-tête X-HubSpot-Signature sera un hachage SHA-256 conçu à l'aide du secret de client de votre application associé à des détails de la demande.

Pour vérifier cette signature, effectuez les étapes suivantes :

  • Créez une chaîne qui regroupe les éléments suivants : clientSecret + httpMethod + URI + requestBody (le cas échéant)
  • Créez un hachage SHA-256 de la chaîne résultante.
  • Comparez la valeur de hachage à la signature.
    • Si elle est égale, cette demande a été validée.
    • Si ces valeurs sont différentes, cette demande peut avoir été modifiée en transit ou quelqu'un peut usurper les demandes à votre point de terminaison.

    Remarques :
    • L'URI utilisé pour créer la chaîne source doit correspondre exactement à la demande initiale, y compris le protocole. Si vous rencontrez des difficultés lors de la validation de la signature, assurez-vous que tous les paramètres de demande sont dans le même ordre que dans la demande initiale.
    • La chaîne source doit être encodée en UTF-8 avant de calculer le hachage SHA-256.

Exemple pour une demande GET :



Exemple de demande avec un corps :

 

Validation des signatures de demande v3

Lorsque la demande de HubSpot est envoyée avec l'en-tête X-HubSpot-Signature-Version défini sur v3, l'en-tête X-HubSpot-Signature sera un hachage HMAC SHA-256 conçu à l'aide du secret de client de votre application associé à des détails de la demande. Il comprendra également un en-tête X-HubSpot-Request-Timestamp.
  • Rejetez la demande si l'horodatage est supérieur à 5 minutes.
  • Créez une chaîne encodée en UFT-8 qui regroupe les éléments suivants : requestMethod + requestUri + requestBody + horodatage. L'horodatage est fourni par l'en-tête X-HubSpot-Request-Timestamp.
  • Créez un hachage HMAC SHA-256 de la chaîne résultante en utilisant le secret d'application comme secret pour la fonction HMAC SHA-256.
  • Encodez le résultat de la fonction HMAC en Base64.
  • Comparez la valeur de hachage à la signature. Si elle est égale, cette demande a été validée comme provenant de HubSpot. Nous recommandons d'utiliser une comparaison de chaîne à durée fixe pour éviter les attaques temporelles.

Cet article vous a-t-il été utile ? *
Ce formulaire est destiné à recueillir les avis sur la documentation pour les développeurs. Si vous souhaitez faire part de votre avis sur les produits HubSpot, veuillez le partager sur le forum des idéesde la communauté.