Je développe une application Web reposante qui utilise un cadre Web populaire sur le backend, par exemple (rails, sinatra, flask, express.js). Idéalement, je souhaite développer le côté client avec Backbone.js. Comment laisser uniquement mon côté client JavaScript interagir avec ces appels d'API? Je ne veux pas que ces appels d'API soient publics et soient appelés par curl
ou simplement en entrant le lien sur le navigateur.
91
Réponses:
Comme premier principe, si votre API est consommée par votre client JS, vous devez supposer qu'elle est publique: un simple débogueur JS met un attaquant dans une position, où il peut envoyer une requête identique octet par octet à partir d'un outil de son choix.
Cela dit, si j'ai bien lu 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 ne soit impliqué. Voici quelques idées pour savoir comment, sinon appliquer, au moins encourager à utiliser votre client:
Je suis sûr que votre API a une sorte de champ d'authentification (par exemple Hash calculé sur le client). Sinon, jetez un œil à cette question SO . Assurez-vous d'utiliser un sel (ou même une clé API) qui est donné à votre client JS sur une base de session (pas codé 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, souvenez-vous de certains en-têtes HTTP (l'agent utilisateur vient à l'esprit) et de l'adresse IP et demandez une nouvelle authentification s'ils changent, en utilisant des listes noires pour les suspects habituels. Cela oblige un agresseur à refaire ses devoirs de manière plus approfondie.
Du côté du serveur, souvenez-vous des derniers appels d'API, et avant d'en autoriser un autre, vérifiez si la logique métier autorise le nouveau maintenant: cela empêche un attaquant de concentrer plusieurs de ses sessions en une seule session avec votre serveur: En 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: je considère qu'il est impossible de rendre complètement impossible pour un abuseur de consommer votre service, mais vous pouvez le rendre si difficile que cela ne vaut peut-être pas la peine.
la source
Vous devez implémenter une sorte de système d'authentification. Une bonne façon de gérer cela est de 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'attendront à 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-jeton-api».
Alternativement, de nombreux systèmes créent des jetons d'accès ou des clés qui sont attendus (comme YouTube, Facebook ou Twitter) en utilisant une sorte de système de compte API. Dans ces cas, votre client devrait les stocker d'une manière ou d'une autre dans le client.
Ensuite, il s'agit simplement d'ajouter une vérification de la session dans votre framework REST et de lever une exception. Si possible, le code d'état (être reposé) serait une erreur 401.
la source
Il existe désormais un standard ouvert appelé "JSON Web Token",
voir https://jwt.io/ & https://en.wikipedia.org/wiki/JSON_Web_Token
la source
Excusez-moi @MarkAmery et Eugene, mais c'est incorrect.
Votre application js + html (client) exécutée dans le navigateur PEUT être configurée pour exclure les appels directs non autorisés à l'API comme suit:
Lors de l'authentification, un "jeton" est renvoyé.
Après l'authentification, seuls les appels d'API avec le «jeton» d'authentification seront acceptés.
Bien sûr, à ce stade, seuls les utilisateurs autorisés qui ont le mot de passe peuvent accéder à l'API, bien que s'ils sont des programmeurs déboguant l'application, ils peuvent y accéder directement à des fins de test.
Maintenant, pour utiliser votre API, ils doivent d'abord télécharger le client et l'exécuter dans un navigateur. Ce n'est qu'après avoir reçu avec succès le rappel, puis l'entrée de l'utilisateur dans un court laps de temps, que l'API acceptera les appels.
Vous n'avez donc pas à craindre qu'il s'agisse d'un utilisateur non autorisé sans informations d'identification.
(Le titre de la question, `` Comment sécuriser les appels d'API REST '', et d'après la plupart de ce que vous dites, c'est votre principale préoccupation, et non la question littérale de COMMENT votre API est appelée, mais plutôt PAR QUI, correct? )
la source
Définissez une variable SESSION sur le serveur lorsque le client charge pour la première fois votre
index.html
(oubackbone.js
etc.)Vérifiez cette variable côté serveur à chaque appel d'API.
PS ce n'est pas une solution "sécurité" !!! Ceci est juste pour alléger la charge sur votre serveur afin que les gens ne l'abusent pas ou ne "relient pas" votre API à partir d'autres sites Web et applications.
la source
Voici ce que je fais:
Sécurisez l'API avec un en-tête HTTP avec des appels tels que X-APITOKEN:
Utilisez des variables de session en PHP. Mettez en place un système de connexion et enregistrez le jeton utilisateur dans les variables de session.
Appelez du 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'appellera pas et le code PHP contient le jeton d'accès à l'API.
la source