0% encontró este documento útil (0 votos)
53 vistas5 páginas

Autenticación

Passport es un middleware de autenticación para Node.js que permite gestionar diferentes mecanismos de autenticación como Facebook, Google y Twitter. La configuración de Passport implica definir estrategias de autenticación, agregar middleware y configurar sesiones de forma opcional.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
53 vistas5 páginas

Autenticación

Passport es un middleware de autenticación para Node.js que permite gestionar diferentes mecanismos de autenticación como Facebook, Google y Twitter. La configuración de Passport implica definir estrategias de autenticación, agregar middleware y configurar sesiones de forma opcional.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Autenticación

Passport

Introducción
Passport es un middleware de autenticación para Nodejs. Está diseñado de forma
modular y, con el nombre estrategias (strategies), te permite gestionar diferentes
mecanismos de autenticación. En su sitio web: http://www.passportjs.org se indican
más de 500 estrategias que puedes usar, entre ellas: facebook, google, twitter.
app.post('/login', passport.authenticate('local', {
successRedirect: '/',

failureRedirect: '/login' }));

En el ejemplo previo, ves cómo se ubica en el middleware al momento de gestionar una


petición POST al /login. Aquí está utilizando una estrategia local que es la que
explicaremos en breve.

Para instalar passport haces:

$ npm install passport

Autenticación
Siempre la autenticación se realiza en el middleware, ejecutando
passport.authenticate(), especificando como parámetro la estrategia a utilizar.
app.post('/login',
passport.authenticate('local'),
function(req, res) {
// Si llega a ejecutarse esta función, la autenticación fue
exitosa.
// `req.user` contiene el usuario autenticado.
res.redirect('/users/' + req.user.username);
});

Material de la Universidad Austral, preparado por el profesor Ezequiel Lamónica, Buenos Aires, Argentina, en
febrero de 2019 para su uso en el Curso 'Desarrollo lado servidor: NodeJS, Express y MongoDB'. Prohibida su
reproducción total o parcial sin la previa autorización escrita del autor
1
Por default, si la autenticación falla, Passport responde con un 401 Unauthorized. Si la
autenticación es exitosa, se ejecuta la próxima función a gestionar (la definida en el next)
y se inyecta al usuario en req.user, como puedes observar en el ejemplo anterior.

Redirecciones
Después del proceso de autenticación, es común hacer una redirección a alguna página
de tu sitio.
app.post('/login',
passport.authenticate('local', { successRedirect: '/',
failureRedirect: '/login' }));
Puedes sobrescribir el comportamiento por default, indicando donde quieres redirigir al
usuario en caso de éxito o falla del proceso. En el ejemplo anterior puedes ver que
pasamos un objeto con 2 propiedades: sucessRedirect, que indica la ruta a redirigir en
caso de éxito (a la página principal en este caso) y failureRedirect, que indica la ruta en
caso de falla (al login en este caso).

Configuración
La configuración se llevará a cabo en 3 partes:
1. Estrategias de autenticación.
2. Middleware de la aplicación.
3. Sesiones (opcional, pueden no utilizarse).

Estrategias
Como dijimos previamente, “estrategias” es el término utilizado por Passport para
indicar los mecanismos de autenticación. Pueden desde gestionar un usuario y password
hasta mecanismos de OAuth 2.0 o OpenID.
Antes de utilizar el mecanismo deseado de autenticación, debemos especificarlo y
configurarlo.

Material de la Universidad Austral, preparado por el profesor Ezequiel Lamónica, Buenos Aires, Argentina, en
febrero de 2019 para su uso en el Curso 'Desarrollo lado servidor: NodeJS, Express y MongoDB'. Prohibida su
reproducción total o parcial sin la previa autorización escrita del autor
2
Las estrategias a configurar (y por lo tanto, que estarán disponibles para su utilización)
se indican con el método use(). Veamos un ejemplo con LocalStrategy, que se basa en
un mecanismo simple de nombre de usuario y password.
var passport = require('passport')
, LocalStrategy = require('passport-local').Strategy;

passport.use(new LocalStrategy(
function(username, password, done) {
User.findOne({ username: username }, function (err, user) {
if (err) { return done(err); }
if (!user) {

return done(null, false, { message: 'Username


incorrecto.' });
}
if (!user.validPassword(password)) {

return done(null, false, { message: 'Password


incorrecto.' });
}

return done(null, user);


});
}
));

Callback de verificación
Las estrategias requieren siempre un callback de verificación. El propósito de ese
callback es obtener el objeto que representa al usuario a través de las credenciales
provistas (probablemente implica una búsqueda en la base de datos, memoria cache,
etc.).
Cuando Passport autentica un request, obtiene las credenciales contenidas en el request
y luego ejecuta el callback con esas credenciales como parámetros, en este caso,
username y password. Si las credenciales son válidas, se ejecuta el método done para
proveerle a Passport el usuario autenticado.
return done(null, user);

Material de la Universidad Austral, preparado por el profesor Ezequiel Lamónica, Buenos Aires, Argentina, en
febrero de 2019 para su uso en el Curso 'Desarrollo lado servidor: NodeJS, Express y MongoDB'. Prohibida su
reproducción total o parcial sin la previa autorización escrita del autor
3
Si las credenciales no son válidas (por ejemplo, el password es incorrecto o no existe un
usuario con el username indicado), se ejecuta el método done con false en lugar del
usuario.
return done(null, false);

Como parámetro adicional puede indicarse un mensaje de error.


return done(null, false, { message: 'Password incorrecto.' });

Finalmente, si ocurre un error (base de datos no disponible, por ejemplo), se ejecuta el


método done con el objeto del error. La diferencia con el error de autenticación es que
se trata de un error del servidor que nada tiene que ver con las credenciales provistas.
return done(err);

Middleware
En una aplicación Express, el middleware passport.initialize() debe incorporarse para
inicializar la herramienta. Si utilizas sesiones persistentes, también debes hacerlo con
passport.session().
Veamos un ejemplo de configuración común:
app.configure(function() {
app.use(express.static('public'));
app.use(express.cookieParser());
app.use(express.bodyParser());
app.use(express.session({ secret: 'keyboard cat' }));
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
});

Sesiones
Como vimos en la nota técnica anterior, las credenciales utilizadas para autenticarse sólo
se envían en el proceso de autenticación durante el login. Si la autenticación es exitosa,
se establecerá una sesión y se mantendrá en vía cookie en el navegador del usuario.
Los request posteriores no enviarán las credenciales, sino que pasarán la cookie que
contendrá una identificación de la sesión. Para trabajar con este sistema, Passport
provee 2 métodos para serializar y deserializar el usuario desde una sesión.
Material de la Universidad Austral, preparado por el profesor Ezequiel Lamónica, Buenos Aires, Argentina, en
febrero de 2019 para su uso en el Curso 'Desarrollo lado servidor: NodeJS, Express y MongoDB'. Prohibida su
reproducción total o parcial sin la previa autorización escrita del autor
4
passport.serializeUser(function(user, done) {
done(null, user.id);
});

passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});

En el ejemplo aquí arriba, sólo el user.id es serializado y guardado en la sesión. En los


siguientes request, sólo deserializamos la sesión obteniendo el id del usuario y lo
buscamos en la base para traer el objeto completo que se guardará en req.user.

Material de la Universidad Austral, preparado por el profesor Ezequiel Lamónica, Buenos Aires, Argentina, en
febrero de 2019 para su uso en el Curso 'Desarrollo lado servidor: NodeJS, Express y MongoDB'. Prohibida su
reproducción total o parcial sin la previa autorización escrita del autor
5

También podría gustarte