Protéger votre API - Guide de démarrage rapide

Pourquoi est-ce nécessaire ?

CrowdHandler fonctionne en redirigeant les utilisateurs finaux qui tentent d'accéder à une page Web ou à l'interface d'une application protégée vers une « salle d'attente ». Si les points de terminaison API qui pilotent l'expérience utilisateur sont identifiables, par exemple s'ils sont appelés côté client, les utilisateurs avertis, les revendeurs et/ou les robots pourraient tenter de contourner complètement l'interface utilisateur afin d'obtenir directement ce qu'ils veulent via vos points de terminaison API.

Dois-je m'inquiéter ?

Bien que cela ne soit pas déterminant, vous devriez envisager de protéger vos points de terminaison API si l'un ou plusieurs des critères suivants sont remplis :

  • Les points de terminaison de votre API transactionnelle sont accessibles.
  • Vous vendez des produits très prisés pour lesquels la demande risque de dépasser l'offre.
  • Votre clientèle est très à l'aise avec les technologies.
  • Vos produits sont connus pour être la cible de revendeurs.

Passer à l'action

Scénario 1 - Le point de terminaison de l'API utilise le même domaine que le site que vous protégez.

Exemple

Domaine protégé - https://tickets.example.com

Point de terminaison de l'API - https://tickets.example.com/v1/api

Prérequis

Vous devriez déjà avoir intégré votre site à CrowdHandler à l'aide de l'une de nos options d'intégration via CDN ou côté serveur.

de protection des salles de CrowdHandler#

Toutes les URL

Aucune autre action n'est requise

URL correspondant à des expressions régulières

  • La ou les pages sur lesquelles les utilisateurs finaux ajoutent le produit très demandé à leur panier doivent être protégées.
  • L'API permettant d'ajouter le produit recherché au panier doit être protégée.

Éléments à prendre en

Les routes URL de mon API sont génériques

Modifiez les routes URL de votre API afin qu'elles contiennent l'ID du produit ou le slug en tant que paramètres de chaîne de requête.

https://tickets.example.com/v1/api/basket -> https://tickets.example.com/v1/api/basket?id=64398

Cela donnera lieu à des matchs de salles CrowdHandler.

Prévenir l'usurpation d'identité

Dans votre API, assurez-vous que l'ID du produit ou le slug figurant dans l'URL de l'API correspond à l'ID du produit ou au slug présent dans la charge utile. Sans cette couche de protection supplémentaire, l'ID du produit ou le slug figurant dans la chaîne de requête pourrait être modifié afin de contourner la configuration de votre salle CrowdHandler.

Scénario 2 - Le point de terminaison de l'API utilise un domaine différent de celui du site que vous protégez.

Exemple

Domaine protégé - https://tickets.example.com

Point de terminaison de l'API - https://datasource.com/v1/api

de la salle CrowdHandler#

  1. Configurez vos salles CrowdHandler de manière à protéger le domaine du site (https://tickets.example.com), et NON le domaine de l'API.
  2. La ou les pages sur lesquelles les utilisateurs finaux ajoutent le produit très demandé à leur panier doivent être protégées.
  3. La configuration des salles doit correspondre uniquement aux URL de votre domaine protégé.

de mise en œuvre#

Modifier le contenu des requêtes API

Ajoutez deux champs supplémentaires à la charge utile de votre route API « Ajouter au panier ». Clé : sourceURL Valeur : location.href (l'URL de la page protégée effectuant l'appel API) Clé : chToken Valeur : jeton CrowdHandler (récupéré à partir d'un cookie ou du stockage local, selon le type d'intégration).

Valider la requête côté serveur.

const urlParts = new URL(params.sourceURL);
const token = params.chToken;

const crowdhandler = require('crowdhandler-sdk');

  const mockRequest = {
    getHost: () => urlParts.host,
    getPath: () => urlParts.pathname,
    getCookies: () => `crowdhandler=${token}`
  };

  const { gatekeeper } = crowdhandler.init({
    publicKey: 'your-public-key',
    request: mockRequest,
    response: {}, // Empty object is fine for validation only
  });

  const result = await gatekeeper.validateRequest();
  // ✅ This works!
  // result.promoted = true/false
  // Reject if false ❌
  // result.error = { message, statusCode, code } (if error occurred)