Adici贸n de autenticaci贸n a Express con Passport

    Introducci贸n

    La autenticaci贸n de usuario es una de esas cosas en las que probablemente no piense demasiado, pero casi todos los sitios web o aplicaciones lo requieren. Si tuviera que implementar la autenticaci贸n usted mismo, 驴podr铆a hacerlo? Bueno, no te preocupes, probablemente no tengas que hacerlo. Dado que esta funcionalidad es tan com煤n, casi todos los lenguajes / marcos web con los que me he encontrado ya tienen una soluci贸n lista para usar, y para Node, puede usar el plugin Express Passport.

    Como siempre, le recomiendo que conf铆e en los paquetes populares para cosas como esta, ya que probablemente ya hayan pasado por los dolores de cabeza de encontrar errores y vulnerabilidades dentro del c贸digo.

    驴Qu茅 es Passport?

    los Pasaporte package es un middleware de autenticaci贸n modular y expandible para Node.js que agrega funcionalidad de autenticaci贸n a su aplicaci贸n Express. Cuando la mayor铆a de la gente piensa en la autenticaci贸n, piensa en la combinaci贸n tradicional de nombre de usuario y contrase帽a. Si bien esto sigue siendo muy popular, el uso de otros servicios para autenticar a un usuario OAuth se ha convertido en otro m茅todo popular. Dado que Passport es un middleware muy extensible, le permite conectar m谩s de 300 proveedores de autenticaci贸n diferentes como Facebook, Twitter, Google y m谩s, la mayor铆a de los cuales utilizan el est谩ndar OAuth.

    Sin embargo, no todas las estrategias utilizan OAuth. Tambi茅n puede elegir basado en hash (pasando un hash a trav茅s de una cadena de consulta, datos POST o en los encabezados HTTP), Tokens web JSON, o incluso solo Autenticaci贸n b谩sica HTTP (Me gusta esto: http://username:[email聽protected]/). Aunque algunas de estas estrategias pueden tener diferentes par谩metros, en gran medida ser谩n los mismos, por lo que deber铆a poder intercambiar estrategias f谩cilmente si es necesario.

    Para rastrear las sesiones de un usuario que ha iniciado sesi贸n entre solicitudes despu茅s de la autenticaci贸n inicial, Passport guarda los datos de la sesi贸n en una cookie, que crea y env铆a al usuario. Todo esto se maneja entre bastidores para todas las estrategias.

    C贸mo usar Passport

    Para usar Passport, deber谩 conectarlo a su Express app como lo har铆a con cualquier otro middleware:

    var express = require('express');
    var passport = require('passport');
    
    var app = express();
    
    app.configure(function() {
    	app.use(express.cookieParser());
    	app.use(express.bodyParser());
    	app.use(express.session({ secret: 'derpy' }));
    
    	app.use(passport.initialize());
    	app.use(passport.session());	// Required for persistent login sessions (optional, but recommended)
    });
    

    Tenga en cuenta que si decide habilitar sesiones, debe usar express.session() antes de passport.session() para garantizar que la sesi贸n de inicio de sesi贸n del usuario se restaure en el orden correcto.

    En la mayor铆a de los casos, querr谩 habilitar sesiones; de lo contrario, no se recordar谩 al usuario entre solicitudes.

    Una vez que haya inicializado Passport y configurado las sesiones, es hora de configurar su estrategia. Como dije anteriormente, la mayor铆a son bastante similares en cuanto a la configuraci贸n, as铆 que echemos un vistazo a la estrategia m谩s utilizada, LocalStrategy:

    var LocalStrategy = require('passport-local').Strategy;
    
    // Express/Passport setup here...
    
    passport.use(new LocalStrategy(
    	{
    		usernameField: 'email',
            passwordField: 'password'
    	},
    	function(email, password, done) {
            User.loadOne({ email: email }).then(function(user) {
                if (!user || !user.authenticate(password)) {
                    return done(null, false, { message: 'Incorrect email or password.' });
                }
    
                done(null, user);
            });
        })
    );
    

    los User.loadOne... parte ser谩 espec铆fica para su aplicaci贸n (estoy usando el Camuflaje ODM aqu铆). La devoluci贸n de llamada le env铆a el nombre de usuario / correo electr贸nico y la contrase帽a del usuario, que en el caso de “Estrategia local” se recuper贸 de los datos del formulario enviado con campos de entrada llamados email y password.

    El formulario HTML del que provienen estos datos podr铆a verse as铆:

    <form method="post" role="form">
        <input type="text" name="email"/>
        <input type="password" name="password"/>
        <button type="submit">Login</button>
    </form>
    

    Observe que los campos se nombran email y password como especificamos en el LocalStrategy encima.

    Con este correo electr贸nico y contrase帽a extra铆dos de req por Passport, podemos buscar al usuario en nuestra base de datos y luego comparar la contrase帽a dada con la que obtuvimos de la base de datos (no se preocupe, es un hach铆s salado de la contrase帽a). Devolver un objeto de usuario v谩lido al done La devoluci贸n de llamada le dice a Passport que las credenciales eran v谩lidas. De lo contrario volvemos false y un mensaje de error.

    Lo 煤ltimo que debe hacer es decirle a Passport c贸mo serializar y deserializar el objeto de usuario. Lo que esto significa es que Passport necesita que le diga c贸mo identificar de forma 煤nica a un usuario con solo una cadena, como una identificaci贸n o una direcci贸n de correo electr贸nico.

    // Express/Passport setup here...
    
    // Passport strategy setup here...
    
    passport.serializeUser(function(user, done) {
    	done(null, user.id);
    });
    
    passport.deserializeUser(function(id, done) {
    	User.loadOne({ _id: id }).then(function(user) {
            done(null, user);
        }).catch(function(err) {
            done(err, null);
        });
    });
    

    En el serializeUser funci贸n anterior, ya hemos recuperado los datos del usuario de la base de datos y necesitamos decirle a Passport qu茅 informaci贸n usar en la cookie para identificar de forma 煤nica al usuario, que en este caso es user.id.

    Xa deserializeUser, Passport obtuvo la cadena de cookies (el ID de usuario) y debe convertirla en un objeto de usuario. Entonces usamos el id para buscar el usuario en la base de datos. Lo que devuelve aqu铆 se pasa en cada solicitud como req.user a la ruta.

    Conclusi贸n

    La mayor铆a de las aplicaciones web y muchas aplicaciones nativas utilizan alguna forma de autenticaci贸n, por lo que ser铆a bastante bueno dejar que Passport se encargue de todo el trabajo duro por usted. Todo lo que necesita hacer es decidir una estrategia.

    No es que necesite m谩s motivaci贸n para usar Passport, pero tenga en cuenta que lograr la autenticaci贸n correcta es dif铆cil y, dado que es el guardi谩n de los datos confidenciales de sus usuarios, ser铆a mejor confiar en un paquete que ha sido probado a fondo. y probado.

    驴Qu茅 opinas de Passport y c贸mo lo has usado en el pasado? 隆H谩znoslo saber en los comentarios!

     

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *