283 votes

l'authentification de l'utilisateur pour les bibliothèques node.js?

Existe-t-il d'authentification de l'utilisateur pour les bibliothèques node.js? En particulier, je suis à la recherche de quelque chose qui peut faire une authentification par mot de passe pour un utilisateur (à l'aide d'un custom backend d'authentification DB), et d'associer l'utilisateur à une session.

Avant, j'ai écrit un auth bibliothèque, j'ai pensé que je voudrais voir si les gens savaient de bibliothèques existantes. Ne pouvais pas trouver quelque chose d'évident, via une recherche sur google.

-Shreyas

239voto

Jared Hanson Points 8390

Si vous êtes à la recherche d'un cadre d'authentification pour se Connecter ou Express, Passeport vaut la peine d'étudier: https://github.com/jaredhanson/passport

(Divulgation: je suis le développeur de Passeport)

J'ai développé Passeport après avoir enquêté sur les deux connectez-auth et everyauth. Alors qu'ils sont à la fois grands modules, ils n'ont pas en fonction de mes besoins. Je voulais quelque chose de plus léger et discret.

Le passeport est décomposé en modules distincts, de sorte que vous pouvez choisir d'utiliser uniquement ce dont vous avez besoin (OAuth, seulement si nécessaire). Passeport aussi ne pas monter toutes les routes, dans votre application, vous donnant la flexibilité de décider quand et où vous voulez l'authentification, et des crochets pour contrôler ce qui se passe lors de l'authentification réussit ou échoue.

Pour exemple, voici le processus à deux étapes de l'installation en fonction du formulaire (nom d'utilisateur et le mot de passe d'authentification:

passport.use(new LocalStrategy(
  function(username, password, done) {
    // Find the user from your DB (MongoDB, CouchDB, other...)
    User.findOne({ username: username, password: password }, function (err, user) {
      done(err, user);
    });
  }
));

app.post('/login', 
  passport.authenticate('local', { failureRedirect: '/login' }),
  function(req, res) {
    // Authentication successful. Redirect home.
    res.redirect('/');
  });

D'autres stratégies sont disponibles pour l'authentification via Facebook, Twitter, etc. Les stratégies personnalisées peuvent être branchés, si nécessaire.

91voto

nivoc Points 1704

Session + Si

Je suppose que la raison pour laquelle vous n'avez pas trouvé beaucoup de bonnes bibliothèques est que l'utilisation d'une bibliothèque pour l'authentification est la plupart du temps au cours d'ingénierie.

Ce que vous cherchez est juste une session-liant :) Une session avec:

if login and user == xxx and pwd == xxx 
   then store an authenticated=true into the session 
if logout destroy session

thats it.


Je suis en désaccord avec votre conclusion que le connectez-plugin auth est le chemin à parcourir.

J'utilise également connecter mais je n'utilise pas connectez-auth pour deux raisons:

  1. À mon humble avis pauses connectez-auth, le très puissant et facile à lire oignon-anneau de l'architecture de connexion. Un no-go - mon avis :). Vous pouvez trouver un très bon et d'un court article sur la façon de connecter les œuvres et les rondelles d'oignon idée ici.

  2. Si vous - comme l'a écrit - voulez juste utiliser une base ou http de connexion avec la base de données ou un fichier. Connectez-auth est bien trop gros. C'est plus pour des trucs comme OAuth 1.0, OAuth 2.0 & Co


Très simple d'authentification avec connect

(Il est complet. Juste l'exécuter pour des tests, mais si vous voulez l'utiliser dans la production, assurez-vous d'utiliser le protocole https) (Et pour être RESTE-Principe-Conforme, vous devez utiliser un POST-Demande à la place d'une Demande de b/c vous modifiez un état :)

var connect = require('connect');
var urlparser = require('url');

var authCheck = function (req, res, next) {
    url = req.urlp = urlparser.parse(req.url, true);

    // ####
    // Logout
    if ( url.pathname == "/logout" ) {
      req.session.destroy();
    }

    // ####
    // Is User already validated?
    if (req.session && req.session.auth == true) {
      next(); // stop here and pass to the next onion ring of connect
      return;
    }

    // ########
    // Auth - Replace this example with your Database, Auth-File or other things
    // If Database, you need a Async callback...
    if ( url.pathname == "/login" && 
         url.query.name == "max" && 
         url.query.pwd == "herewego"  ) {
      req.session.auth = true;
      next();
      return;
    }

    // ####
    // This user is not authorized. Stop talking to him.
    res.writeHead(403);
    res.end('Sorry you are not authorized.\n\nFor a login use: /login?name=max&pwd=herewego');
    return;
}

var helloWorldContent = function (req, res, next) {
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end('authorized. Walk around :) or use /logout to leave\n\nYou are currently at '+req.urlp.pathname);
}

var server = connect.createServer(
      connect.logger({ format: ':method :url' }),
      connect.cookieParser(),
      connect.session({ secret: 'foobar' }),
      connect.bodyParser(),
      authCheck,
      helloWorldContent
);

server.listen(3000);

NOTE

J'ai écrit cette déclaration a plus d'un an et ont actuellement aucun nœud actif projets. Il y a donc peut-être à l'API, les Changements dans l'Express. Merci d'ajouter un commentaire si je doit changer quoi que ce soit.

28voto

shreddd Points 3237

Ressemble à la connectez-plugin auth pour le connecter middleware est exactement ce dont j'ai besoin: http://wiki.github.com/ciaranj/connect-auth/creating-a-form-based-strategy

Je suis à l'aide d'exprimer [ http://expressjs.com ] afin de le connecter plugin correspond très bien puisque express est sous-classé (ok - prototypée) de se connecter

16voto

Tom Points 5531

J'ai fait la recherche de la même chose. Plus précisément, je voulais le suivant:

  1. Pour utiliser express.js, qui enveloppe de Connecter le middleware de la capacité de
  2. "La forme en fonction de l'authentification"
  3. Un contrôle granulaire sur les routes sont authentifiés
  4. Une base de données back-end pour les utilisateurs/mots de passe
  5. Des sessions d'utilisation

Ce que j'ai fait était de créer mon propre middleware fonction check_auth que je passe en argument à chaque itinéraire, je veux authentifié. check_auth seulement des contrôles de la session, et si l'utilisateur n'est pas connecté, puis redirige vers la page de connexion, comme suit:

function check_auth(req, res, next) {

  //  if the user isn't logged in, redirect them to a login page
  if(!req.session.login) {
    res.redirect("/login");
    return; // the buck stops here... we do not call next(), because
            // we don't want to proceed; instead we want to show a login page
  }

  //  the user is logged in, so call next()
  next();
}

Ensuite, pour chaque itinéraire, je vous l'assure cette fonction est transmis en tant que middleware. Par exemple:

app.get('/tasks', check_auth, function(req, res) {
    // snip
});

Enfin, nous avons besoin de gérer le processus de connexion. C'est simple:

app.get('/login', function(req, res) {
  res.render("login", {layout:false});
});

app.post('/login', function(req, res) {

  // here, I'm using mongoose.js to search for the user in mongodb
  var user_query = UserModel.findOne({email:req.body.email}, function(err, user){
    if(err) {
      res.render("login", {layout:false, locals:{ error:err } });
      return;
    }

    if(!user || user.password != req.body.password) {
      res.render("login",
        {layout:false,
          locals:{ error:"Invalid login!", email:req.body.email }
        }
      );
    } else {
      // successful login; store the session info
      req.session.login = req.body.email;
      res.redirect("/");
    }
  });
});

En tout cas, cette approche a été principalement conçu pour être flexible et simple. Je suis sûr qu'il y a de nombreuses façons de l'améliorer. Si vous en avez, je serais très heureux de recevoir vos commentaires.

EDIT: C'est un exemple simplifié. Dans un système de production, vous ne voulez stocker et comparer les mots de passe en texte clair. Comme un intervenant, il y a des libs qui peuvent aider à gérer les mots de passe de sécurité.

14voto

Peter Lyons Points 47794

Aussi jeter un oeil à everyauth si vous voulez tiers/réseau social de connexion de l'intégration.

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