Comment sécuriser les appels API REST?

Je suis en train de développer l’application web reposante qui utilise un framework web populaire sur le backend, par exemple (rails, sinatra, flask, express.js). Idéalement, je veux développer le côté client avec Backbone.js. Comment laisser uniquement mon client javascript interagir avec ces appels API? Je ne veux pas que ces appels d’API soient publics et soient appelés par curl ou simplement en entrant le lien dans le navigateur.

En premier lieu, si votre API est utilisée par votre client JS, vous devez supposer qu’elle est publique: un simple débogueur JS place un attaquant dans une position où il peut envoyer une requête identique à un octet pour un octet outil de son choix.

Cela dit, si je lis correctement votre question, ce n’est pas ce que vous voulez éviter: ce que vous ne voulez vraiment pas, c’est que votre API soit consommée (régulièrement) sans que votre client JS soit impliqué. Voici quelques idées sur la façon de ne pas appliquer, puis encouragez au moins à utiliser votre client:

  • Je suis sûr que votre API possède une sorte de champ d’authentification (par exemple, Hash calculé sur le client). Sinon, jetez un oeil à cette question SO . Assurez-vous d’utiliser un sel (ou même une clé API) qui est fourni à votre client JS lors d’une session (sans codage en dur). De cette façon, un consommateur non autorisé de votre API est obligé de travailler beaucoup plus.

  • Lors du chargement du client JS, rappelez-vous certains en-têtes HTTP (l’agent utilisateur vient à l’esprit) et l’adresse IP et demandez une nouvelle authentification s’ils changent, en utilisant des listes noires pour les suspects habituels. Cela oblige un attaquant à refaire ses devoirs.

  • Du côté du serveur, rappelez-vous les derniers appels d’API, et avant d’en autoriser un autre, vérifiez si la logique métier autorise le nouveau: Cela empêche un attaquant de concentrer plusieurs de ses sessions en une seule session avec votre serveur: combinaison avec les autres mesures, cela rendra un agresseur facilement détectable.

Je n’aurais peut-être pas dit cela avec la clarté nécessaire: j’estime impossible d’empêcher un abuseur de consumr votre service, mais vous pouvez faire en sorte que cela ne vaille pas la peine.

Vous devez implémenter une sorte de système d’authentification. Un bon moyen de gérer cela consiste à définir certaines variables d’en-tête attendues. Par exemple, vous pouvez avoir un appel d’API auth / login qui renvoie un jeton de session. Les appels ultérieurs à votre API s’attendent à ce qu’un jeton de session soit défini dans une variable d’en-tête HTTP avec un nom spécifique tel que “votre-api-token”.

De nombreux systèmes peuvent également créer des jetons d’access ou des clés (youtube, facebook ou twitter) utilisant un système de compte api. Dans ces cas, votre client devrait les stocker d’une certaine manière dans le client.

Il suffit ensuite d’append une vérification de la session dans votre structure REST et de lancer une exception. Si possible, le code de statut (être reposant) serait une erreur 401.

Il existe maintenant un standard ouvert appelé “JSON Web Token”,

voir https://jwt.io/ & https://en.wikipedia.org/wiki/JSON_Web_Token

JSON Web Token (JWT) est un standard ouvert basé sur JSON (RFC 7519) pour créer des jetons qui revendiquent un certain nombre de revendications. Par exemple, un serveur peut générer un jeton ayant la revendication “connecté en tant qu’administrateur” et le fournir à un client. Le client pourrait alors utiliser ce jeton pour prouver qu’il est connecté en tant qu’administrateur. Les jetons sont signés par la clé du serveur, ce qui permet au serveur de vérifier que le jeton est légitime. Les jetons sont conçus pour être compacts, sécurisés contre les URL et utilisables en particulier dans le contexte d’authentification unique du navigateur Web. Les revendications JWT peuvent généralement être utilisées pour transmettre l’identité des utilisateurs authentifiés entre un fournisseur d’identité et un fournisseur de services, ou tout autre type de revendications requirejs par les processus métier. [1] [2] Les jetons peuvent également être authentifiés et chiffrés. [3] [4]

Excusez-moi @ MarkAmery et Eugene, mais c’est faux.

Votre application js + html (client) s’exécutant dans le navigateur peut être configurée pour exclure les appels directs non autorisés à l’API comme suit:

  1. Première étape: configurez l’API pour exiger une authentification. Le client doit d’abord s’authentifier via le serveur (ou un autre serveur de sécurité) en demandant par exemple à l’utilisateur humain de fournir le mot de passe correct.

Avant l’authentification, les appels à l’API ne sont pas acceptés.

Lors de l’authentification, un “jeton” est renvoyé.

Après l’authentification, seuls les appels API avec le “jeton” d’authentification seront acceptés.

Bien entendu, à ce stade, seuls les utilisateurs autorisés disposant du mot de passe peuvent accéder à l’API, même si les programmeurs déboguent l’application, ils peuvent y accéder directement à des fins de test.

  1. Deuxième étape: Configurez maintenant une API de sécurité supplémentaire, qui doit être appelée dans un délai très court après la demande initiale de l’application client js + html sur le serveur. Ce “rappel” indiquera au serveur que le client a été téléchargé avec succès. Limitez les appels de votre API REST au travail uniquement si le client a été demandé récemment et avec succès.

Maintenant, pour utiliser votre API, ils doivent d’abord télécharger le client et l’exécuter dans un navigateur. L’API n’acceptera les appels qu’après avoir reçu avec succès le rappel, puis l’entrée de l’utilisateur dans un court laps de temps.

Vous n’avez donc pas à vous inquiéter du fait qu’il s’agisse d’un utilisateur non autorisé sans informations d’identification.

(Le titre de la question «Comment sécuriser les appels API REST» et de la plupart de vos propos est-il votre principale préoccupation, et non la question littérale de la manière dont votre API est appelée, mais plutôt PAR QUI, est-ce exact? )

  1. Définissez une variable SESSION sur le serveur lorsque le client charge pour la première fois votre index.html (ou backbone.js etc.)

  2. Vérifiez cette variable côté serveur sur chaque appel d’API.

PS ce n’est pas une solution “de sécurité” !!! Ceci est juste pour alléger la charge sur votre serveur afin que les gens ne l’abusent pas ou ne “lient pas” votre API à partir d’autres sites Web et applications.

Voici ce que je fais:

  1. Sécurisez l’API avec un en-tête HTTP avec des appels tels que X-APITOKEN:

  2. Utilisez les variables de session en PHP. Avoir un système de connexion en place et enregistrer le jeton utilisateur dans les variables de session.

  3. Appelez le code JS avec Ajax vers PHP et utilisez la variable de session avec curl pour appeler l’API. De cette façon, si la variable de session n’est pas définie, elle n’appelle pas et le code PHP contient le jeton d’access à l’API.