Anfragen von HubSpot validieren

 

Um sicherzustellen, dass die Anfragen, die Ihre Integration von HubSpot erhält, tatsächlich von HubSpot stammen, füllen wir zwei Header aus: X-HubSpot-Signatur und X-HubSpot-Signatur-Version.

Der X-HubSpot-Signature-Header enthält die Signatur, die verifiziert werden muss. Die zur Überprüfung der Signatur verwendete Methode hängt von der Version der Signatur ab.

Der X-HubSpot-Signatur-Version-Header enthält eine Versionsnummer, also v2, die angibt, welche Methode verwendet werden soll, um die in X-HubSpot-Signaturenthaltene Signatur zu überprüfen.

In den Dokumentationsseiten unten finden Sie mehr Informationen zum Verifizieren der verschiedenen Versionen der Signatur.


Validieren der v1-Anfragesignatur:

Wird die Anfrage von HubSpot mit dem X-HubSpot-Signatur-Version-Header auf v1 festgelegt gesendet, ist der X-HubSpot-Signatur-Header ein SHA-256-Hash, der mithilfe des Client-Geheimnisses Ihrer App in Kombination mit den Details der Anfrage erstellt wurde.

Um diese Signatur zu überprüfen, führen Sie die folgenden Schritte aus:

  • Erstellen Sie eine Zeichenfolge, die Folgendes miteinander verkettet: Client-Geheimnis Anfragetext (falls vorhanden)
  • Erstellen Sie einen SHA-256-Hash von der resultierenden Zeichenfolge.
  • Vergleichen Sie den Hash-Wert mit der Signatur.
    • Wenn sie gleich sind, hat diese Anfrage die Überprüfung bestanden.
    • Wenn diese Werte nicht übereinstimmen, wurde diese Anfrage möglicherweise während des Transfers manipuliert, oder jemand spooft Anfragen an Ihren Endpunkt.

Beispiel für eine Anfrage mit einem Text:

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

Beispiele für die v1-Anfragesignatur: 

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'

Der resultierende Hash würde folgendermaßen aussehen:
232db2615f3d666fe21a8ec971ac7b5402d33b9a925784df3ca654d05f4817de


Validieren der v2-Anfragesignatur:

Wird die Anfrage von HubSpot mit dem X-HubSpot-Signatur-Version-Header auf v2 festgelegt gesendet, ist der X-HubSpot-Signatur-Header ein SHA-256-Hash, der mithilfe des Client-Geheimnisses Ihrer App in Kombination mit den Details der Anfrage erstellt wurde.

Um diese Signatur zu überprüfen, führen Sie die folgenden Schritte aus:

  • Erstellen Sie eine Zeichenfolge, die Folgendes miteinander verkettet: Client-Geheimnis + HTTP-Methode + URI + Anfragetext (falls vorhanden)
  • Erstellen Sie einen SHA-256-Hash von der resultierenden Zeichenfolge.
  • Vergleichen Sie den Hash-Wert mit der Signatur.
    • Wenn sie gleich sind, hat diese Anfrage die Überprüfung bestanden.
    • Wenn diese Werte nicht übereinstimmen, wurde diese Anfrage möglicherweise während des Transfers manipuliert, oder jemand spooft Anfragen an Ihren Endpunkt.

    Hinweise:
    • Der zur Erstellung der Quellzeichenfolge verwendete URI muss genau mit der ursprünglichen Anfrage übereinstimmen, einschließlich des Protokolls. Wenn Sie Schwierigkeiten bei der Validierung der Signatur haben, stellen Sie sicher, dass alle Abfrageparameter in genau der gleichen Reihenfolge sind wie in der ursprünglichen Anfrage aufgeführt.
    • Die Quellzeichenfolge sollte vor der Berechnung des SHA-256-Hash-Werts UTF-8-codiert werden.

Beispiel für eine GET-Anfrage:



Beispiel für eine Anfrage mit einem Text:

 

Validieren der v3-Anfragesignatur:

Wird die Anfrage von HubSpot mit dem X-HubSpot-Signatur-Version-Header auf v3 festgelegt gesendet, ist der X-HubSpot-Signatur-Header ein HMAC SHA-256-Hash, der mithilfe des Client-Geheimnisses Ihrer App in Kombination mit den Details der Anfrage erstellt wurde. Sie enthält auch einen X-HubSpot-Anfragezeitstempel-Header.
  • Lehnen Sie die Anfrage ab, wenn der Zeitstempel älter als 5 Minuten ist.
  • Erstellen Sie eine UTF-8-codierte Zeichenfolge, die Folgendes miteinander verkettet: requestMethod + requestUri + requestBody + Zeitstempel. Der Zeitstempel wird vom X-HubSpot-Anfragezeitstempel-Header bereitgestellt.
  • Erstellen Sie einen HMAC SHA-256-Hash der resultierenden Zeichenfolge, indem Sie das Anwendungsgeheimnis als das Geheimnis für die HMAC SHA-256-Funktion verwenden.
  • Base64-Codieren Sie das Ergebnis der HMAC-Funktion.
  • Vergleichen Sie den Hash-Wert mit der Signatur. Wenn sie gleich sind, wurde diese Anfrage als von HubSpot stammend verifiziert. Wir empfehlen die Verwendung eines Zeichenfolgenvergleichs mit Zeitkonstante, um sich vor Rechenzeitangriffen zu schützen.

War dieser Artikel hilfreich? *
Dieses Formular dient dazu, Feedback zu unserer Entwicklerdokumentation zu sammeln. Wenn Sie uns Ihre Meinung zu HubSpot-Produkten mitteilen möchten, teilen Sie diese bitte im Ideenforum der Community.