- Para validar una solicitud usando la última versión de la firma de HubSpot, usa el encabezado
X-HubSpot-Signature-V3y sigue las instrucciones asociadas para validar la versión v3 de la firma. - Para la compatibilidad con versiones anteriores, las solicitudes de HubSpot también incluyen versiones anteriores de la firma. Para validar una versión anterior de la firma, verifica el encabezado
X-HubSpot-Signature-Version, y luego sigue las instrucciones asociadas que aparecen abajo según si la versión esv1ov2.
Validar solicitudes usando la firma de solicitud v1
Si tu aplicación está suscrita a eventos de objetos del CRM a través de la API de webhooks, las solicitudes de HubSpot se enviarán con el encabezadoX-HubSpot-Signature-Version definido como v1. El encabezado X-HubSpot-Signature será un hash SHA-256 creado usando el secreto del cliente de tu aplicación junto con detalles de la solicitud.
Para verificar esta versión de la firma, realiza los siguientes pasos:
- Crea una cadena que concatene lo siguiente:
Client secret+request body(si está presente). - Crea un hash SHA-256 de la cadena resultante.
- Compara el valor del hash con el valor del encabezado
X-HubSpot-Signature:- Si son iguales, esta solicitud ha superado la validación.
- Si estos valores no coinciden, es posible que esta solicitud haya sido manipulada en tránsito o que alguien esté falsificando solicitudes a tu endpoint.
Ejemplos de firma de solicitud v1:
Ejemplo en Python
Ejemplo de Ruby
Ejemplo de Node.js
Ejemplo de Java
232db2615f3d666fe21a8ec971ac7b5402d33b9a925784df3ca654d05f4817de
Validar solicitudes usando la firma de solicitud v2
Si tu aplicación está manejando datos de una acción de webhook en un workflow o si estás devolviendo datos para una tarjeta del CRM personalizada, la solicitud de HubSpot se envía con el encabezadoX-HubSpot-Signature-Version definido como v2. El encabezado X-HubSpot-Signature será un hash SHA-256 creado usando el secreto del cliente de tu aplicación junto con detalles de la solicitud.
Para verificar esta firma, realiza los siguientes pasos:
- Crea una cadena que concatene lo siguiente:
Client secret+http method+URI+request body(si está presente). - Crea un hash SHA-256 de la cadena resultante.
- Compara el valor del hash a la firma.
- Si son iguales, esta solicitud ha superado la validación.
- Si estos valores no coinciden, es posible que esta solicitud haya sido manipulada en tránsito o que alguien esté falsificando solicitudes a tu endpoint.
- La URI utilizada para crear la cadena de origen debe coincidir exactamente con la solicitud original, incluyendo el protocolo. Si tienes problemas para validar la firma, asegúrate de que cualquier parámetro de consulta esté en el mismo orden que se enumeró en la solicitud original.
- La cadena de origen debe tener codificación UTF-8 antes de calcular el hash SHA-256.
Ejemplo de una solicitud GET:
En el caso de una solicitudGET, necesitarías el secreto del cliente de tu aplicación y campos específicos de los metadatos de la solicitud. Estos campos se enumeran a continuación con valores de marcadores de posición incluidos:
- Secreto del cliente
yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy - Método HTTP:
GET - URI
https://www.example.com/webhook_uri - Cuerpo de la solicitud:
""
yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyyGEThttps://www.example.com/webhook_uri
Después de calcular un hash SHA-256 de la cadena concatenada anterior, la firma resultante que esperarías que coincidiera con la del encabezado sería: eee2dddcc73c94d699f5e395f4b9d454a069a6855fbfa152e91e88823087200e
Ejemplo de una solicitud POST
En el caso de una solicitudPOST, necesitarías el secreto del cliente de tu aplicación, campos específicos de los metadatos de la solicitud y una representación de cadena del cuerpo de la solicitud (por ejemplo, usar JSON.stringify(request.body) para un servicio de Node.js). Estos campos se enumeran a continuación con valores de marcadores de posición incluidos:
- Secreto del cliente
yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy - Método HTTP:
POST - URI
https://www.example.com/webhook_uri - Cuerpo de la solicitud:
{"example_field":"example_value"}
yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyyPOSThttps://www.example.com/webhook_uri{"example_field":"example_value"}
Después de calcular un hash SHA-256 de la cadena concatenada anterior, la firma resultante que esperarías que coincidiera con la del encabezado sería:9569219f8ba981ffa6f6f16aa0f48637d35d728c7e4d93d0d52efaa512af7900
Después de la firma [SHA-ing], podrías comparar la firma esperada resultante con la proporcionada en el encabezado x-hubspot-signature de la solicitud:
El fragmento de código de Node.js que aparece abajo detalla cómo podrías incorporar la validación de solicitudes v2 correspondiente a una solicitud GET si estuvieras ejecutando un servidor Express para manejar las solicitudes entrantes. Ten en cuenta que el bloque de código que aparece abajo es un ejemplo y omite ciertas dependencias que podrías necesitar para ejecutar un servicio Express con todas las funciones. Confirma que estás ejecutando las bibliotecas estables y seguras más recientes al implementar la validación de solicitudes para tu servicio específico.
Ejemplos de firma de solicitud v2:
Ejemplo de Node.js
Ejemplo de Java
Validar la firma de solicitud v3
El encabezadoX-HubSpot-Signature-v3 será un hash SHA-256 creado usando el secreto del cliente de tu aplicación junto con detalles de la solicitud. También incluirá un encabezado X-HubSpot-Request-Timestamp.
Al validar una solicitud que utiliza el encabezado X-HubSpot-Signature-v3, deberás
- Rechazar la solicitud si la marca de tiempo es anterior a 5 minutos.
- En la URI de la solicitud, decodifica cualquiera de los caracteres codificados por URL que se enumeran en la siguiente tabla. No necesitas decodificar el signo de interrogación que denota el comienzo de la cadena de consulta.
| Valor codificado | Valor decodificado |
|---|---|
%3A | : |
%2F | / |
%3F | ? |
%40 | @ |
%21 | ! |
%24 | $ |
%27 | ' |
%28 | ( |
%29 | ) |
%2A | * |
%2C | , |
%3B | ; |
- Crea una cadena codificada utf-8 que concatene lo siguiente:
requestMethod+requestUri+requestBody+ marca de tiempo. La marca de tiempo es proporcionada por el encabezadoX-HubSpot-Request-Timestamp. - Crea un hash SHA-256 de la cadena resultante usando el secreto de la aplicación como el secreto de la función HMAC SHA-256.
- Base64 codifica el resultado de la función HMAC.
- Compara el valor del hash a la firma. Si son iguales, significa que esta solicitud se verificó como proveniente de HubSpot. Se recomienda que uses la comparación de cadenas en tiempo constante para protegerte de los ataques de sincronización.
POST si estuvieras ejecutando un servicio backend para gestionar las solicitudes entrantes. Ten en cuenta que el bloque de código que aparece abajo es un ejemplo y omite ciertas dependencias que podrías necesitar para ejecutar un servicio Express con todas las funciones. Confirma que estás ejecutando las bibliotecas estables y seguras más recientes al implementar la validación de solicitudes para tu servicio específico.