Requêtes pour fichiers statiques

Pour le zoning et les Session Replays, Contentsquare doit récupérer les éléments statiques de votre site.
Afin d’autoriser Contentsquare à récupérer ces éléments, choisissez l’une des options suivantes :

  1. Autorisez les adresses IP Contentsquare
  2. Utilisez un header statique personnalisé pour valider les requêtes
  3. Utilisez un header personnalisé pour valider les requêtes

Ouvrez les ports 80 (HTTP) et 443 (HTTPS) et autorisez les adresses IP ci-dessous afin d’empêcher que le scraper soit bloqué par votre proxy, firewall, ou configuration serveur :

  • IP actuelle : 52.18.162.157 (APP & DT scrapper)
  • Nouvelle IP : 100.24.76.90 (microproxy-production.us-east-1.csq)
  • Nouvelle IP : 34.192.98.148 (fallback microproxy-production.us-east-1.csq)
  • IP actuelle : 52.18.162.157 (App & DT Scrapper)
  • Nouvelle IP : 54.247.44.196 (microproxy-production.eu-west-1)
  • Nouvelle IP : 52.51.9.12 (fallback microproxy-production.eu-west-1)
  • IP actuelle : 20.75.90.236 (Azure East US Scrapper)
  • Nouvelle IP : 100.24.76.90 (microproxy-production.us-east-1.csq)
  • Nouvelle IP : 34.192.98.148 (fallback microproxy-production.us-east-1.csq)
  • IP actuelle : 20.67.250.109 (Azure North Europe Scrapper)
  • Nouvelle IP : 54.247.44.196 (microproxy-production.eu-west-1)
  • Nouvelle IP : 52.51.9.12 (fallback microproxy-production.eu-west-1)

Utiliser un header statique personnalisé

Section titled Utiliser un header statique personnalisé

Avec cette option, Contentsquare ajoute un header personnalisé aux paramètres du projet.

{
"headers": {
"my-new-header-key": "myKeyValue"
}
}

Vous pouvez valider que les requêtes du scraper contiennent ce header avec la bonne valeur.

receivedHeaderExample = 'myKeyValue';
const CONTENTSQUARE_CUSTOM_HEADER = 'myKeyValue';
if (receivedHeaderExample === CONTENTSQUARE_CUSTOM_HEADER) {
//
}

Utiliser un header dynamique personnalisé

Section titled Utiliser un header dynamique personnalisé

Vous pouvez utiliser le header personnalisé X-CONTENTSQUARE-SIGNATURE pour valider que les requêtes proviennent effectivement de Contentsquare.

Le header X-CONTENTSQUARE-SIGNATURE est une chaîne de caractères dans ce format :

<TIMESTAMP>-base64(hmac('sha256', <SECRET>, <RESOURCE_DOMAIN>-<TIMESTAMP>))

avec :

  • <TIMESTAMP>: le temps auquel la requête est envoyée, d’après Date.now(),
  • <RESOURCE_DOMAIN>: le domaine complet qui héberge la ressource,
  • <SECRET>: le secret partagé entre vous et Contentsquare pour le projet, généré à la création du projet.

Avec un secret abcde, le Contentsquare service scrapper a émis cette requête le 6 août 2020 à 05h39, pour récupérer le logo Contentsquare :

Terminal window
curl \
-H 'accept-language: en-GB,en-US;q=0.9,en;q=0.8,fr;q=0.7' \
-H 'accept: application/json, text/plain, */*' \
-H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36' \
-H 'X-CONTENTSQUARE-SIGNATURE: 1596706743675-BxmHtG6vu4CfFlzpHxc0qYOmR0iMajlIvA2B4404qk4=' \
-X GET https://contentsquare.com/wp-content/themes/kps3-contentsquare/public/assets/images/contentsquare-logo.svg?tv=1.3.0

Vous pouvez regénérer la signature et vérifier qu’elle correspond à la valeur du headerX-CONTENTSQUARE-SIGNATURE header en fournissant :

  • Le timestamp de la requête entrante (1596706743675),
  • Le domaine sur lequel est hébergé la ressource (contentsquare.com),
  • Le secret fourni par Contentsquare (abcde).
const crypto = require('crypto');
const secret = 'abcde'; // Given by someone from CS
receivedHeaderExample = '1596706743675-BxmHtG6vu4CfFlzpHxc0qYOmR0iMajlIvA2B4404qk4=';
// Extract the timestamp and digest from the received header
const [timestamp, receivedDigest] = receivedHeaderExample.split('-');
// Extra security step to make sure the timestamp is not too old
const currentTimestamp = Date.now();
if(currentTimestamp - timestamp > 5 * 60 * 1000) {
throw new Error("Validation failed. Timestamp signature is older than 5 minutes");
}
// Recreate the string that was used to generate the digest
const dataToSign = `${resourceDomain}-${timestamp}`; // e.g. 'contentsquare.com-1596706743675';
// Create a new digest using the same secret and algorithm
const hmac = crypto.createHmac('sha256', secret);
hmac.update(dataToSign);
const generatedDigest = hmac.digest('base64');
// Compare the newly generated digest with the one received in the header
if (receivedDigest === generatedDigest) {
console.log('Header is valid');
// Code to validate request
}