246 votos

la autenticación de usuario de las bibliotecas para node.js?

¿Existe algún autenticación de usuario de las bibliotecas para node.js? En particular estoy buscando algo que puede hacer de autenticación de contraseña de un usuario (utilizando una costumbre backend auth DB), y asociar ese usuario con una sesión.

Antes escribí un auth biblioteca, pensé que iba a ver si la gente sabía de bibliotecas existentes. No podía encontrar cualquier cosa obvia a través de una búsqueda en google.

-Shreyas

214voto

Jared Hanson Puntos 8390

Si usted está buscando un marco de autenticación para Conectarse o Express, Pasaporte vale la pena investigar: https://github.com/jaredhanson/passport

(Disclosure: soy el desarrollador de Pasaporte)

He desarrollado Pasaporte después de la investigación de conectar-auth y everyauth. Mientras que ambos son grandes módulos, que no se adaptaba a mis necesidades. Yo quería algo que fuera más ligero y discreto.

El pasaporte se divide en módulos separados, así que usted puede elegir para utilizar sólo lo que necesita (OAuth, sólo si es necesario). Pasaporte no monte ningún rutas en la aplicación, dándole la flexibilidad para decidir cuando y donde quieras de autenticación, y los ganchos para el control de lo que sucede cuando la autenticación se realiza correctamente o no.

Por ejemplo, aquí es el proceso de dos pasos para la configuración basada en formularios (nombre de usuario y contraseña) autenticación:

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('/');
  });

Estrategias adicionales están disponibles para la autenticación a través de Facebook, Twitter, etc. Personalizado de estrategias puede ser enchufado, si es necesario.

87voto

nivoc Puntos 1704

Sesión + Si

Supongo que la razón por la que no he encontrado muchos buenos bibliotecas es que el uso de una biblioteca para la autenticación es principalmente a través de la ingeniería.

Lo que se busca es simplemente una sesión de cuaderno :a) Una sesión con:

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

eso es todo.


No estoy de acuerdo con su conclusión de que el connect-auth plugin es el camino a seguir.

Estoy usando también conectar , pero yo no uso connect-auth por dos razones:

  1. En mi humilde opinión se rompe connect-auth muy potente y fácil de leer anillo de cebolla arquitectura de conectarse. Un no-ir - mi opinión :). Usted puede encontrar una muy buena y breve artículo acerca de cómo conectar las obras y el aro de cebolla idea aquí.

  2. Si - como está escrito - sólo desea utilizar una base o http inicio de sesión con la base de datos o archivo. Connect-auth es demasiado grande. Es más para cosas como OAuth 1.0, OAuth 2.0 & Co


Un muy simple de autenticación con connect

(Es completa. Solo tiene que ejecutar para las pruebas, pero si quieres usarlo en la producción, asegúrese de utilizar https) (Y para ser RESTO-Principio-Compatible debe utilizar un POST-Solicitud en lugar de una Solicitud b/c cambio de un estado :)

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);

NOTA

Escribí esta declaración hace más de un año y tiene actualmente ningún nodo activo de los proyectos. Así que no se puede ser a la API de Cambios en el Express. Por favor agregar un comentario si debo cambiar algo.

25voto

shreddd Puntos 3237

Se parece a la de conectar-auth plugin para conectar el middleware es exactamente lo que necesito: http://wiki.github.com/ciaranj/connect-auth/creating-a-form-based-strategy

Estoy usando express [ http://expressjs.com ] para conectar plugin encaja muy bien ya express es una subclase (ok - prototipo) de conectar

14voto

Tom Puntos 5531

Yo estaba básicamente buscando la misma cosa. Específicamente, he querido que la siguiente:

  1. Para utilizar express.js, que se ajusta a Conectar el middleware de la capacidad de
  2. La "forma" basados en la autenticación
  3. Control Granular sobre que rutas son autenticado
  4. Una base de datos back-end para que los usuarios/contraseñas
  5. El uso de sesiones

Lo que hice fue crear mi propio middleware de la función check_auth que me pase como argumento para cada ruta quiero autenticado. check_auth simplemente comprueba la sesión, y si el usuario no está conectado, luego se redirige a la página de inicio de sesión, así:

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();
}

A continuación, para cada ruta, puedo asegurar que esta función se le pasa como middleware. Por ejemplo:

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

Por último, tenemos que manejar el proceso de inicio de sesión. Esto es sencillo:

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 cualquier caso, este enfoque fue principalmente diseñado para ser flexible y simple. Estoy seguro de que hay muchas maneras de mejorar. Si usted tiene cualquiera, me gustaría mucho que sus comentarios.

EDIT: Este es un ejemplo simplificado. En un sistema de producción, nunca quisiéramos almacenar y comparar las contraseñas en texto sin formato. Como un comentarista señala, hay librerías que pueden ayudar a administrar la seguridad de la contraseña.

13voto

Peter Lyons Puntos 47794

También eche un vistazo a everyauth si desea terceros/red social de inicio de sesión de integración.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X