4 votes

Autorisation de Mongoose/Express sur les verbes http

J'ai un service REST node.js qui fonctionne avec mongoose et express. J'utilise également merse pour mettre en place mon routage.

Ce que j'aimerais réaliser maintenant, ce sont les types de sceanrios suivants :

Scenario I: e.g. blogpost
- GET -> no authentication required
- POST/PUT/DELETE -> authentication required

Scenario II: e.g. user
- GET -> authentication required
- POST/PUT/DELETE -> authentication required plus username of logged in user has to match

J'ai déjà jeté un coup d'œil à everyauth et mongoose-auth, mais je n'ai rien trouvé qui puisse me donner ce genre de contrôle.

15voto

freakish Points 20067

Oubliez everyauth. Cette bibliothèque est une surcharge, à mon avis. L'implémentation de l'authentification est assez simple en fait, suivez le schéma :

  1. Passes d'utilisateur username y password au serveur ;
  2. Le serveur reçoit username y password et vérifie dans la base de données s'il existe un utilisateur avec ce nom. password . S'il n'y a pas d'utilisateur, répondez simplement par une erreur ;
  3. Nous avons un utilisateur, utilisons maintenant le mécanisme de session intégré d'Express. Appelez req.session.regenerate et dans le callback faire req.session.userID = user.id . Express enverra automatiquement le cookie à l'utilisateur ;
  4. Créez un middleware (qui doit déclencher avant tout autre gestionnaire de demande), qui recherche essentiellement dans la base de données des req.session.userID . S'il en trouve un, il le stocke dans req c'est-à-dire req.user = user ;
  5. Dans une vue, vous vérifiez simplement si req.user est définie. Si elle l'est, alors nous sommes authentifiés. Et c'est fini !

ad 1+2) Pour rendre l'authentification sûre, vous devriez utiliser une certaine cryptographie (et/ou HTTPS). Par exemple, le mot de passe devrait être conservé dans la base de données en deux parties : salt y hash . salt est généré de manière aléatoire (au moment de l'enregistrement) et hash = hash_it(pwd, salt) , donde hash_it est un algorithme de hachage (par exemple : MD5 ou SHA256).

L'authentification côté client peut maintenant se faire en plusieurs étapes (uniquement si vous savez utiliser JavaScript) :

  1. Le serveur envoie des données aléatoires new_salt à la page de connexion (ou en générer un en JavaScript, il n'est pas nécessaire de cacher l'algorithme de génération) ;
  2. L'utilisateur envoie une demande AJAX give me salt for user X et le serveur répond avec le salt stockée dans la BD (la salt est publique) ;
  3. Sur le hachage de la réponse pwd avec salt puis hacher à nouveau le résultat avec new_salt et le stocker dans la variable hpwd ;
  4. Le client envoie username , hpwd y new_salt au serveur ;
  5. Le serveur reçoit pwd de DB pour username , hashs pwd avec new_salt et compare le résultat à hpwd (note : vous ne stockez pas new_salt ).

Cette méthode est intéressante, car à chaque fois que vous vous connectez, des données aléatoires (du point de vue externe) circulent à travers le réseau, même si l'option username y el password est le même.

C'est important, car password La fuite est une chose sérieuse. Pas parce que quelqu'un peut casser le compte de votre application (c'est un dommage mineur, à moins que vous ne soyez une banque - mais alors vous ne poseriez pas de telles questions :D ). C'est surtout parce que les gens ont tendance à utiliser les mêmes mots de passe pour plusieurs sites, y compris les comptes bancaires.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X