Passer au contenu principal

Existe-t-il un moyen d’empêcher une application cliente d’effectuer certains appels d’API ?

Comment restreindre les API sensibles au cloud code uniquement...

Paul Winterhalder avatar
Écrit par Paul Winterhalder
Mis à jour il y a plus d’une semaine

La sécurité est une considération importante pour les applications.

Dès le départ, brainCloud a été conçu dans un souci de sécurité. Notre API client garantit que :

  • Tous les appels nécessitent une connexion client authentifiée

  • Tous les appels sont cryptés (via SSL)

  • Tous les messages sont marqués d'un code de contrôle (basé sur la clé secrète de l'application) pour éviter toute falsification.

  • Tous les messages ont également des identifiants de paquets pour empêcher les attaques par relecture

  • Les données appartiennent aux utilisateurs et l'accès est protégé via ACL (listes de contrôle d'accès)

De plus, nous limitons également activement certaines API à être uniquement appelables par cloud code (par exemple, les API de devises, la création de classements, etc.).

Bien entendu, toutes les applications ne sont pas identiques et vous souhaiterez peut-être restreindre l'accès à des API supplémentaires uniquement à partir du cloud code.

Bien que cela ne soit pas directement intégré à la solution, le puissant mécanisme d'API Hook de brainCloud permet de le faire ! Voici comment :

Arrière-plan

Pré-hooks

Les pré-hooks sont des scripts cloud spécifiques configurés pour être appelés immédiatement avant un appel d'API spécifique. Ils permettent de vérifier les paramètres envoyés à un appel d'API, et potentiellement de les modifier et/ou de rejeter l'appel si le script le souhaite.

Drapeau de Cloud Code

Chaque appel brainCloud reçoit quelques paramètres standard lors de son appel, comme le service et le fonctionnement de la méthode appelée. Un paramètre supplémentaire, automatiquement inséré par le répartiteur d'API, est l'indicateur ccCall . Cet indicateur indique true si la méthode d'API (ou le script) est appelée depuis un script de Cloud Code ou false depuis un client.

Le script !

Créez un script appelé PREHOOK_DisallowCallFromClient avec le contenu suivant :

Description

Vérifie si l'appel provient du client et, si c'est le cas, l'interdit. Utilise l'indicateur spécial ccCall pour déterminer si l'appel a été effectué via le cloud code.

Paramètres

{ 
"service": "aService",
"operation": "AN_OPERATION",
"message": {"ccCall": false },
"parms": {}
}

Code

var results = {}; 

// Par défaut, tout va bien - dites au système de continuer le traitement
results.status = 200;

// Si cet appel ne provient pas du cloud code, enregistrez-le et interdisez-le.
if ( ! data.message.ccCall ) {

// Le remplacement du statut interdit le traitement de l'appel.
results.status = 403;
results.reasonCode = 99999;
results.errorMessage = "VIOLATION: Not allowed to call "
+ data.service + ":" + data.operation + " from client.";

// Enregistrez également ce qui s'est passé...
var _log = bridge.getLogServiceProxy();
var logMsg = "VIOLATION: Protected API ("
+ data.service + ":" + data.operation
+ ") called from client with profileId "
+ bridge.getProfileId() + ". Disallowed.";
_log.logWarning( logMsg, JSON.stringify( data.message ) );
}

// retourne les résultats
results;

Le brancher

Vous pouvez associer ce script à n'importe quel appel d'API.
Pour cela :

  • Accéder à Conception > Cloud Code > Points d'encrage d'API

  • Cliquez sur [+ Nouveau Point D'encrage D'API...] pour afficher la boîte de dialogue Créer Point d'encrage d'API

  • Choisissez le service et l'opération auxquels vous souhaitez joindre le script

  • Assurez-vous de choisir "Pré" dans le sélecteur Pré/Post

  • Et enfin choisissez votre script - PREHOOK_DisallowCallFromClient.

  • Vous pouvez laisser les paramètres du hook vides - notre hook ne les utilise pas.

  • Cliquez sur [Sauvegarder] pour mettre votre hook en place.

Et voilà : désormais, l'appel d'API ne peut être appelé qu'à partir du cloud code !

Bonne chance !

Vos commentaires sont importants pour nous. Veuillez noter cette réponse ci-dessous. Merci !

Avez-vous trouvé la réponse à votre question ?