Adición de autenticación a Express con Passport

A

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!

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias para su correcto funcionamiento. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad