Comment mettre en œuvre une sécurité API REST avec node.js
J'ai commencer la planification d'une API REST avec node.js ,d'exprimer et de mongodb. L'API fournit des données pour un site web (public et privé) et peut-être plus tard d'une application mobile. L'interface sera développé avec AngularJS.
Pour quelques jours, j'ai lu beaucoup de choses sur la sécurisation des Api REST, mais je ne suis pas une solution définitive. Aussi loin que je comprends, c'est d'utiliser le protocole HTTPS pour fournir une sécurité de base. Mais comment je peux protéger l'API dans ce cas d'utilisation:
-
Seuls les visiteurs/utilisateurs du site/app sont autorisés à obtenir des données pour la partie publique du site web/app
-
Seuls les utilisateurs authentifiés et autorisés sont autorisés à obtenir des données pour le secteur privé (et seulement les données, où l'utilisateur des autorisations)
Au moment où j'y pense pour autoriser uniquement les utilisateurs avec une session active de l'utilisation de l'API. Pour autoriser les utilisateurs, je vais utiliser le passeport et l'autorisation j'ai besoin de mettre en place quelque chose pour moi. Tous les sur le dessus de HTTPS.
Quelqu'un peut-il fournir un certain nombre de meilleures pratiques ou expériences? Est-il d'un manque dans mon “architecture”?
- J'imagine que l'API ne doit être utilisé qu'à partir de l'interface que vous fournissez? Dans ce cas, l'utilisation de la session pour s'assurer que l'utilisateur est valide semble être une bonne solution. Pour les autorisations, vous pouvez prendre un coup d'oeil à node-rôles.
- Qu'avez-vous enfin faire pour cela? Toute chaudière plaque de code (serveur/de l'application mobile du client) vous pouvez partager?
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème que vous décrivez. Le site web que je suis en train de construire peut être accessible à partir d'un téléphone mobile et à partir du navigateur, donc j'ai besoin d'une api pour permettre aux utilisateurs d'inscription, connexion et faire quelques tâches spécifiques. En outre, j'ai besoin de prendre en charge l'évolutivité, le même code en cours d'exécution sur les différents procédés/machines.
Car les utilisateurs peuvent CRÉER des ressources (aka POST/PUT actions), vous devez sécuriser votre api. Vous pouvez utiliser oauth ou vous pouvez créer votre propre solution, mais gardez à l'esprit que toutes les solutions peut être rompu si le mot de passe il est vraiment facile à découvrir. L'idée de base est d'authentifier les utilisateurs en utilisant le nom d'utilisateur, mot de passe et un jeton, alias le apitoken. Cette apitoken peut être généré en utilisant nœud-uuid et le mot de passe peut être haché à l'aide de pbkdf2
Ensuite, vous devez enregistrer la session quelque part. Si vous l'enregistrez dans la mémoire d'un objet ordinaire, si vous tuez le serveur et de le redémarrer à nouveau, la session sera détruite. Aussi, ce n'est pas évolutif. Si vous utilisez haproxy pour équilibrer la charge entre les machines ou tout simplement si vous utilisez des travailleurs, cet état de session seront stockées dans un seul processus, de sorte que si le même utilisateur est redirigé vers un autre processus/de la machine, il aura besoin de s'authentifier à nouveau. Par conséquent, vous avez besoin de stocker la session dans un endroit commun. Ceci est généralement réalisé à l'aide de redis.
Lorsque l'utilisateur est authentifié (nom d'utilisateur+mot de passe+apitoken) générer un autre jeton pour la session, aka accesstoken. Encore une fois, avec nœud-uuid. Envoyer à l'utilisateur la accesstoken et le nom d'utilisateur. Le nom d'utilisateur (clé) et le accesstoken (valeur) sont stockés dans le redis avec et la date d'expiration, par exemple 1h.
Maintenant, chaque fois que l'utilisateur n'a aucune opération à l'aide de l'api rest, il faudra envoyer le nom d'utilisateur et le accesstoken.
Si vous autorisez les utilisateurs à l'inscription à l'aide de l'api rest, vous aurez besoin de créer un compte admin avec un admin apitoken et de les stocker dans l'application mobile (crypter nom d'utilisateur+mot de passe+apitoken) parce que les nouveaux utilisateurs ne disposent pas d'un apitoken quand ils s'inscrivent.
Le web utilise également cette api, mais vous n'avez pas besoin d'utiliser apitokens. Vous pouvez utiliser express avec un redis stocker ou d'utiliser la même technique décrite ci-dessus, mais en contournant le apitoken vérifier et retourner à l'utilisateur le nom d'utilisateur+accesstoken dans un cookie.
Si vous avez des zones privées de comparer le nom d'utilisateur avec les utilisateurs autorisés lors de l'authentification. Vous pouvez également appliquer des rôles aux utilisateurs.
Résumé:
Une alternative sans apitoken serait l'utilisation de HTTPS et envoyer le nom d'utilisateur et mot de passe dans l'en-tête d'Autorisation et de mettre en cache le nom d'utilisateur dans le redis.
getApitoken(username, password)
et puis de nouveauauthenticate(username, password, apitoken)
vous pouvez appelergetApitoken()
une fois et ensuite chiffrer le apitoken et l'enregistrer dans l'application mobile de sorte que vous n'avez pas besoin d'obtenir le apitoken lors des connexions suivantesapitoken
? est-il un "secondaire" mot de passe?getApiToken(username, password)
le récupère? N'est-il pas comme ayant besoin d'une clé pour entrer dans le club, mais si ils vous connaissent, ils passent sous la porte de toute façon?J'aimerais contribuer à ce code comme une solution structurelle à la question posée, selon (je l'espère) pour la accepté de répondre. (Vous pouvez très facilement personnaliser).
Ce serveur peut être testé avec curl:
Je viens de finir un exemple d'application qui fait cela dans un assez basique, mais de façon claire. Il utilise la mangouste avec mongodb pour stocker les utilisateurs et le passeport pour l'auth de gestion.
https://github.com/Khelldar/Angular-Express-Train-Seed
Il y a beaucoup de questions au sujet RESTE auth des modèles ici sur DONC. Ce sont les plus pertinentes pour votre question:
Fondamentalement, vous avez besoin de choisir entre l'utilisation de l'API de touches (moins sûr que la clé peut être découvert par un utilisateur non autorisé), une application clé et un jeton combo (moyen), ou un Protocole de mise en œuvre (plus sécurisé).
Si vous voulez avoir un cadenas fermé en bas de la zone de votre webapplication qui ne peut être accessible que par les administrateurs de votre société, puis SSL autorisation peut-être pour vous. Il permettra de s'assurer que personne ne peut faire une connexion à une instance de serveur, sauf s'ils ont un certificat autorisé installés dans leur navigateur. La semaine dernière, j'ai écrit un article sur comment configurer le serveur: L'Article
C'est l'un des plus sécurisé configurations, vous trouverez qu'il n'existe pas de nom d'utilisateur/mots de passe concernés afin que personne ne peut avoir accès, à moins que l'un de vos utilisateurs mains la clé de fichiers à un pirate potentiel.
Si vous souhaitez sécuriser votre application, alors vous devriez certainement commencer par utiliser HTTPS au lieu de HTTP, ce qui assure la création d'un canal sécurisé entre vous & les utilisateurs qui permettra d'éviter renifler les données transmises & de l'avant pour les utilisateurs & aidera à garder l'échange de données confidentielles.
Vous pouvez utiliser JWTs (JSON Web Jetons) pour fixer RESTful Api, cela a de nombreux avantages par rapport à la côté serveur séances, les avantages sont principalement:
1 - Plus évolutif, comme votre API serveurs n'auront pas à maintenir des sessions pour chaque utilisateur (qui peut être un lourd fardeau quand vous avez beaucoup de séances)
2 - JWTs sont autonomes & avoir les revendications qui définissent le rôle de l'utilisateur, par exemple & ce qu'il peut accès & a publié à la date & date d'expiration (après qui de JWT n'est pas valide)
3 - plus Facile à gérer à travers load-balancers, & si vous avez plusieurs API de serveurs que vous n'aurez pas à partager les données de session ni de configurer le serveur de la route de la session à la même serveur, à chaque fois qu'une demande avec un JWT frapper n'importe quel serveur, il peut être authentifié & a autorisé
4 - Moins de pression sur votre base de données ainsi que vous n'avez pas à constamment store & récupérer l'id de session & les données pour chaque demande
5 - La JWTs ne peut pas être modifié si vous utilisez un mot clé pour signer le JWT, de sorte que vous pouvez faire confiance les revendications de la JWT qui est envoyé avec la demande sans avoir à vérifier la session de l'utilisateur & si il est autorisé ou pas, vous pouvez simplement vérifier le JWT & puis vous êtes tous ensemble pour savoir qui & ce que cet utilisateur peut faire.
De nombreuses bibliothèques offrent des moyens faciles pour créer & valider JWTs dans la plupart des langages de programmation, par exemple: node.js l'un des plus populaires est jsonwebtoken
Depuis des Api REST vise en général à maintenir le serveur apatrides, de sorte JWTs sont plus compatibles avec ce concept que chaque demande est envoyée avec jeton d'Autorisation qui est autonome (JWT) sans que le serveur avoir à garder une trace de la session de l'utilisateur par rapport à des séances de mettre le serveur à la dynamique de sorte qu'il se souvient de l'utilisateur & son rôle, mais les séances sont également largement utilisé & ont leurs avantages, que vous pouvez rechercher si vous le souhaitez.
Une chose importante à noter est que vous devez sécuriser la diffusion de la JWT pour le client à l'aide de HTTPS & conservez-le en lieu sûr (par exemple dans le local de stockage).
Vous pouvez en apprendre plus sur JWTs à partir de ce lien