web-dev-qa-db-fra.com

Sécuriser mon application Node.js REST API?

Je pourrais le faire avec de l’aide sur mon API REST. J'écris une application Node.js qui utilise Express, MongoDB et a Backbone.js du côté client. J'ai passé les deux derniers jours à essayer de régler tout cela sans trop de chance. J'ai déjà vérifié:

Je souhaite que mon backend et mon interface soient aussi séparés que possible. J'ai donc pensé à utiliser une API REST soigneusement conçue, ce qui serait bien. Je pense que si je réussis un jour à développer une application iPhone (ou quelque chose comme ça), elle pourrait utiliser l'API pour accéder aux données.

MAIS, je veux que cela soit sécurisé. Un utilisateur s'est connecté à mon application Web et je veux m'assurer que mon API est sécurisée. J'ai lu des articles sur OAuth, OAuth 2.0, OpenID, Hmac, les hachages, etc. Je souhaite éviter d'utiliser la connexion externe (Facebook/Twitter/etc). Je souhaite que l'enregistrement et la connexion se fassent sur mon application/serveur.

... mais je suis toujours confus ici. Peut-être qu'il est tard dans la nuit ou que mon cerveau est juste frit, mais je pourrais vraiment faire quelques pas sur ce qu'il faut faire ici. Quelles sont les étapes pour créer une API sécurisée?

Toute aide, information, exemple, démarche ou autre serait formidable. S'il vous plaît aider!

67
littlejim84

Voici une façon de penser différente:

Supposons un instant que vous n'utilisiez pas une API. Votre utilisateur se connecte à l’application en fournissant certaines informations d’identité et vous lui donnez un cookie ou un jeton similaire, que vous utiliserez pour identifier cet utilisateur connecté. L’utilisateur demande alors une page contenant des informations restreintes en le modifiant/le supprimant), vous devez donc vérifier ce jeton pour vous assurer que l'utilisateur est autorisé à afficher ces informations.

Maintenant, il me semble que la seule chose que vous modifiez ici est la manière dont les informations sont fournies. Au lieu de fournir les informations au format HTML, vous renvoyez les informations au format JSON et vous les restituez côté client. Vos demandes AJAX au serveur porteront le même jeton connecté qu'auparavant. Je suggère donc de vérifier ce jeton et de limiter les informations à "ce que l'utilisateur est autorisé à savoir" de la même manière.

Votre API est désormais aussi sécurisée que votre connexion: si quelqu'un connaissait le jeton nécessaire pour accéder à l'API, il serait également connecté au site et aurait toujours accès à toutes les informations. Le mieux, c’est que si vous avez déjà implémenté la connexion, vous n’avez plus vraiment à travailler.

L’intérêt des systèmes tels que OAuth est de fournir cette méthode de «connexion», généralement à partir d’une application tierce et en tant que développeur. Ce serait potentiellement une bonne solution pour une application iPhone ou similaire, mais c'est à l'avenir. Rien de mal à ce que l'API accepte plus d'une méthode d'authentification!

28
mjtamlyn

Par ordre croissant de sécurité/complexité:

Authentification HTTP de base

De nombreuses bibliothèques d'API vous permettent de construire ceci (par exemple, Piston dans Django) ou vous pouvez laisser votre serveur Web le gérer. Nginx et Apache peuvent utiliser les directives du serveur pour sécuriser un site avec un simple mot de passe codé en b64. Ce n'est pas la chose la plus sécurisée au monde mais c'est au moins un nom d'utilisateur et un mot de passe!

Si vous utilisez Nginx, vous pouvez ajouter une section à votre configuration d’hôte comme ceci:

auth_basic "Restricted";
auth_basic_user_file /path/to/htpasswd;

(Le mettre dans votre bloc location /)

Docs: http://wiki.nginx.org/HttpAuthBasicModule

Vous devez vous procurer le script python pour générer ce mot de passe et placer le résultat dans un fichier: http://trac.edgewall.org/browser/trunk/contrib/htpasswd.py?format=txt

L'emplacement du fichier importe peu tant que Nginx y a accès.

HTTPS

Sécurisez la connexion de votre serveur à l’application, c’est la plus élémentaire et elle évitera les attaques de type homme au milieu.

Vous pouvez le faire avec Nginx, la documentation est très complète: http://wiki.nginx.org/HttpSslModule

Un certificat auto-signé pour cela serait bien (et gratuit!).

Clés API

Ceux-ci peuvent être dans n'importe quel format mais ils vous donnent l'avantage de révoquer l'accès si vous en aviez besoin. Peut-être pas la solution idéale pour vous si vous développez les deux extrémités de la connexion. Ils ont tendance à être utilisés lorsque des tiers utilisent l'API, par exemple Github.

OAuth

OAuth 2.0 est celui qui va avec ici. Bien que je ne connaisse pas le fonctionnement sous-jacent de la spécification, il s'agit de la norme de facto pour la plupart des authentifications actuelles (Twitter, Facebook, Google, etc.) et de nombreuses bibliothèques et documents vous aident à les mettre en œuvre. Cela étant dit, il est généralement utilisé pour authentifier un utilisateur en demandant l'authentification à un service tiers.

Étant donné que vous faites le développement aux deux bouts, il serait probablement suffisant de placer votre API derrière l'authentification HTTP de base et de la servir via HTTPS, en particulier si vous ne voulez pas perdre votre temps à jouer avec OAuth.

39
ghickman

Jusqu’à présent, les réponses donnent un excellent travail d’explication, mais ne donnent aucune étape concrète. Je suis tombé sur cet article de blog qui explique en détail comment créer et gérer des jetons en toute sécurité avec Node + Passport.

http://aleksandrov.ws/2013/09/12/restful-api-with-nodejs-plus-mongodb/

8
andyzinsser

Conseils valables pour sécuriser une application Web

Si vous voulez sécuriser votre application, vous devez absolument commencer par utiliser HTTPS au lieu de HTTP, cela crée un canal sécurisé entre vous et les utilisateurs qui empêchera de renifler les données renvoyées. aux utilisateurs et contribuera à maintenir la confidentialité des données échangées.

Vous pouvez utiliser des JWT (jetons Web JSON) pour sécuriser les API RESTful. Cela présente de nombreux avantages par rapport aux sessions côté serveur. Les principaux avantages sont les suivants:

1- Plus évolutif, car vos serveurs d'API n'auront pas à gérer de sessions pour chaque utilisateur (ce qui peut être un lourd fardeau lorsque vous avez plusieurs sessions)

2- Les JWT sont autonomes et ont les revendications qui définissent le rôle de l'utilisateur, par exemple, et ce à quoi il peut accéder et émis à la date et la date d'expiration (après quoi JWT ne sera plus valide).

3- Plus facile à gérer entre les équilibreurs de charge et si vous avez plusieurs serveurs API car vous n'avez pas besoin de partager les données de la session ni de configurer le serveur pour acheminer la session vers le même serveur, chaque fois qu'une demande adressée à un serveur JWT peut être authentifiée. & autorisé

4- Moins de pression sur votre base de données et plus besoin de stocker et de récupérer en permanence les identifiants de session et les données pour chaque demande

5- Les JWT ne peuvent pas être altérés si vous utilisez une clé forte pour signer le JWT, vous pouvez donc faire confiance aux revendications dans le JWT envoyé avec la demande sans avoir à vérifier la session de l'utilisateur et s'il est autorisé ou non. , vous pouvez simplement vérifier le JWT et vous êtes prêt à savoir qui et ce que cet utilisateur peut faire.

Bibliothèques spécifiques à Node.js pour implémenter les JWT:

De nombreuses bibliothèques offrent des moyens simples de créer et de valider des JWT, par exemple: dans node.js, l’un des plus populaires est jsonwebtoken , vous pouvez également utiliser la même bibliothèque pour utiliser la même bibliothèque ou utilisez express-jwt ou koa-jwt (si vous utilisez express/koa)

Étant donné que les API REST visent généralement à conserver le serveur sans état, les JWT sont davantage compatibles avec ce concept, car chaque demande est envoyée avec un jeton d'autorisation autonome (JWT) sans que le serveur doive effectuer le suivi. session utilisateur comparée à des sessions qui rendent le serveur dynamique afin qu'il se souvienne de l'utilisateur et de son rôle; toutefois, les sessions sont également largement utilisées et ont leurs avantages, que vous pouvez rechercher si vous le souhaitez.

Une chose importante à noter est que vous devez livrer le JWT en toute sécurité au client en utilisant HTTPS et le sauvegarder dans un endroit sécurisé (par exemple, dans un stockage local).

Vous pouvez en apprendre plus sur JWTs à partir de ce lien

0
Ahmed Elkoussy