Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Node.js
Code

Autenticar Aplicaciones Node.js con Passport

by
Difficulty:IntermediateLength:LongLanguages:

Spanish (Español) translation by Elías Nicolás (you can also view the original English article)

Implementar estrategias de auntenticación robustas para cualquier aplicación puede ser una tarea desalentadora y las aplicaciones Node.js no son la excepción.

En este tutorial, desarrollaremos una aplicación Node.js desde cero y usaremos un relativamente nuevo pero muy popular middleware de autenticación - Passport para que se haga cargo de nuestros problemas de autenticación.

La documentacion de Passport lo describe como un "simple, no intrusivo middleware de autenticación para Node" y con razón.

Al proporcionarse a sí mismo como un middleware, Passport hace un excelente trabajo separando las labores de una aplicación web de sus necesidades de autenticación. Esto le permite a Passport ser facilmente configurado en cualquier aplicación basada en Express, tal y como configuramos otros middleware de Express como logging, body-parsing, cookie-parsing, session-handling, etc.

Este tutorial asume un entendimiento básico de Node.js y del framework Express y trata de mantener la atención en la autenticación, no obstante crearemos una aplicación muestra de Express desde cero y procederemos agregandole rutas y autenticando algunas de estas rutas.

Estrategias de Autenticación

Passport nos provee de mas de 140 mecanismos de autenticación para escoger. Puede autenticarse en una instancia de base de datos local / remota o utilizar el inicio de sesión único utilizando los proveedores de OAuth para Facebook, Twitter, Google, etc. para autenticarse con sus cuentas de redes sociales o puede elegir entre una extensa lista de proveedores que admiten autenticación Con Passport y proporcionar un módulo de node para eso.

Pero no te preocupes: no necesitas incluir ninguna estrategia/mecanismo que tu aplicación no necesite. Todas estas estrategias son independientes entre sí y están empaquetadas como modulos node separados, los cuales no están incluidos por defecto cuando instalas el middleware Passport: npm install passport

En este tutorial, utilizaremos la Estrategia de autenticación local de Passport y autenticaremos a los usuarios contra una instancia de Mongo DB configurada localmente, almacenando los detalles de usuario en la base de datos. Para usar la Estrategia de autenticación local, necesitamos instalar el módulo passport-local: npm install passport-local

Pero espere: Antes de encender su terminal y comenzar a ejecutar estos comandos, comencemos construyendo una aplicación Express desde cero y añadiendo algunas rutas a ella (para inicio de sesión, registro y inicio) y luego intente agregar nuestro middleware de autenticación. Tenga en cuenta que utilizaremos Express 4 para los propósitos de este tutorial, pero con algunas diferencias menores, Passport funciona igualmente bien con Express 3, también.

Configuración de la aplicación

Si aún no lo ha hecho, siga adelante e instale Express & Express-Generator para generar una aplicación estándar simplemente ejecutando el express passport-mongo en el terminal. La estructura de aplicación generada debería tener este aspecto:

Initial Application Structure

Vamos a eliminar algunas de las funcionalidades por defecto que no estaremos haciendo uso de - sega adelante y elimine la ruta users.js y eliminar sus referencias desde el archivo app.js.

Adición de dependencias del proyecto

Abra package.json y agregue las dependencias para el módulo passport y passport-local.

Dado que vamos a guardar los detalles de usuario en MongoDB, vamos a utilizar Mongoose como nuestra herramienta de modelado de datos de objetos. Otra forma de instalar y guardar la dependencia de package.json es escribiendo:

package.json debería verse así:

Added Mongoose Dependencies

Ahora, instale todas las dependencias y ejecute la aplicación boilerplate ejecutando npm install && npm start. Ahora descargará e instalará todas las dependencias e iniciará el servidor node. Puede comprobar la aplicación Express básica en http://localhost:3000/ pero no hay mucho que ver.

Muy pronto, vamos a cambiar que mediante la creación de una aplicación de pleno derecho expreso que pide muestra una página de registro para un nuevo usuario, el inicio de sesión de un usuario registrado, y autentica al usuario registrado mediante Passport.

Creación de un modelo de Mongoose

Puesto que vamos a guardar los detalles de usuario en Mongo, vamos a crear un modelo de usuario en Mongoose y guardarlo en models/user.js en nuestra aplicación.

Básicamente, estamos creando un modelo Mongoose con el cual podemos realizar operaciones CRUD en la base de datos subyacente.

Configuración de Mongo

Si no tiene Mongo instalado localmente, le recomendamos que utilice servicios de base de datos en nube como Modulus o MongoLab. La creación de una instancia de MongoDB en funcionamiento utilizando estos no sólo es gratuita, sino que es sólo cuestión de unos pocos clics.

Después de crear una base de datos en uno de estos servicios, le dará una base de datos URI  como mongodb://<dbuser>:<dbpassword>@novus.modulusmongo.net:27017/<dbName> que se puede utilizar para realizar operaciones CRUD en la base de datos. Es una buena idea mantener la configuración de la base de datos en un archivo separado que se puede extraer como y cuando sea necesario. Como tal, creamos un módulo de node db.js que se parece a:

Si eres como yo, estás usando una instancia de Mongo local, entonces es el momento de iniciar el demonio mongod y el db.js debería ser similar

Ahora usamos esta configuración en app.js y nos conectamos a ella usando las API de Mongoose:

Configuración de Passport

Passport sólo proporciona el mecanismo para manejar la autenticación, dejando la responsabilidad de implementar la sesión de manipulación de nosotros mismos y para que vamos a utilizar express-session. Abre app.js y pega el código de abajo antes de configurar las rutas:


Esto es necesario ya que queremos que nuestras sesiones de usuario sean persistentes por naturaleza. Antes de ejecutar la aplicación, debemos instalar express-session y añadirla a nuestra lista de dependencias en package.json. Para hacer eso npm install --save express-session

Serializar y deserializar instancias de usuario

Passport también necesita serializar y deserializar la instancia de usuario de un almacén de sesiones para poder dar soporte a las sesiones de inicio de sesión, de modo que cada solicitud subsiguiente no contenga las credenciales del usuario. Proporciona dos métodos serializeUser y deserializeUser para este propósito:

Uso de estrategias de Passport

Ahora vamos a definir las estrategias de Passport para manejar el inicio de sesión y la suscripción. Cada uno de ellos sería una instancia de la Estrategia de autenticación local de Passport y se crearía utilizando la función passport.use() . Utilizamos connect-flash para ayudarnos con el manejo de errores proporcionando mensajes flash que pueden ser mostrados al usuario en caso de error.

Estrategia de acceso

La estrategia de inicio de sesión se ve así:

El primer parámetro de passport.use() es el nombre de la estrategia que se utilizará para identificar esta estrategia cuando se aplique posteriormente. El segundo parámetro es el tipo de estrategia que desea crear, aquí usamos el username-password o LocalStrategy. Debe tenerse en cuenta que, por defecto, LocalStrategy espera encontrar las credenciales de usuario en los parámetros de nombre de usuario username y contraseña password, pero también nos permite utilizar otros parámetros con nombre. La variable de configuración passReqToCallback nos permite acceder al objeto request en la devolución de llamada, lo que nos permite utilizar cualquier parámetro asociado con la solicitud.

A continuación, utilizamos la API de Mongoose para encontrar al usuario en nuestra colección subyacente de usuarios para comprobar si el usuario es un usuario válido o no. El último parámetro en nuestro callback: done denota un método útil con el que podríamos señalar el éxito o el fracaso del módulo Passport. Para especificar el fallo, el primer parámetro debe contener el error o el segundo parámetro debe ser false. Para significar éxito el primer parámetro debe ser nulo null y el segundo parámetro debe evaluarse a un valor verídico truthy, en cuyo caso estará disponible en el objeto de petición request 

Dado que las contraseñas son intrínsecamente débiles en naturaleza, siempre debemos cifrarlas antes de guardarlas en la base de datos. Para ello, usamos bcrypt-nodejs para ayudarnos con el cifrado y descifrado de contraseñas.

Si se siente incómodo con los fragmentos de código y prefiere ver el código completo en acción, no dude en buscar el código aquí.

Estrategia de registro

Ahora, definimos la siguiente estrategia que manejará el registro de un nuevo usuario y creará su entrada en nuestro DB Mongo subyacente:

Aquí, utilizamos de nuevo la API de Mongoose para encontrar si algún usuario con el nombre de usuario dado ya existe o no. Si no es así, cree un nuevo usuario y guarde la información del usuario en Mongo. O devuelve el error usando devolución de llamada done y de flashea los mensajes. Tenga en cuenta que utilizamos bcrypt-nodejs para crear el hash de la contraseña antes de guardarlo:

Creación de rutas

Si fuéramos a ver una vista de pájaro de nuestra aplicación, se vería como:

Birds Eye View of Our Application

Ahora definimos nuestras rutas para la aplicación en el siguiente módulo que toma la instancia de Passport creada en app.js anterior. Guarde este módulo en routes/index.js

La parte más importante del fragmento de código anterior es el uso de passport.authenticate() para delegar la autenticación en las estrategias de inicio de sesión login y de suscripción signup cuando se realiza un POST HTTP en las rutas /login  y /signup  respectivamente. Tenga en cuenta que no es obligatorio nombrar las estrategias en la ruta ruta y se puede nombrar nada.

Creación de vistas de Jade

A continuación, creamos las dos vistas siguientes para nuestra aplicación:

  1. layout.jade contiene la información básica de diseño y estilo
  2. index.jade contiene la página de inicio de sesión que contiene el formulario de inicio de sesión y que da la opción de crear una nueva cuenta

Gracias a Bootstrap, nuestra página de inicio de sesión ahora se ve como

Login Page for Our Passport App

Necesitamos dos vistas más para los detalles de registro y para la página principal de la aplicación:

  1. register.jade contiene el formulario de registro
  2. home.jade dice hola y muestra los detalles del usuario

Si no está familiarizado con Jade, consulte la documentación.

Implementación de la funcionalidad de cierre de sesión

Se le permite a Passport, middleware, agregar ciertas propiedades y métodos a objetos de solicitud y respuesta y hace un uso adecuado de la misma agregando un método muy útil request.logout() que invalida la sesión de usuario aparte de otras propiedades.

Proteger las rutas

El pasaporte también le da la posibilidad de proteger el acceso a una ruta que se considera no apta para un usuario anónimo. Esto significa que si algún usuario intenta acceder a http://localhost:3000/home sin autenticarse en la aplicación, será redirigido a la página principal haciendo

Conclusion

Pasaporte no es el único jugador en este ámbito cuando se trata de autenticar aplicaciones Node.js y existen alternativas como EveryAuth, pero la modularidad, flexibilidad, soporte de la comunidad y el hecho de que su sólo un middleware hace que Passport definitivamente una opción mucho mejor.

Para una comparación detallada entre los dos, aquí hay una perspectiva interesante y informativa del desarrollador de Passport mismo.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.