Desarrollar Webapps Realtime: Auth Con Passport
Código en GitHub: building-realtime-webapp. Release: auth-passport
.
Entorno de desarrollo en Heroku: building-realtime-webapp.
En el artículo anterior vimos cómo implementar un sistema de autenticación básica, y en esta ocasión vamos a implementar el sistema de autenticación usando Passport. Passport es un middleware de autenticación para Node nos permitirá modularizar la autenticación de usuarios en nuestra aplicación y realizar inicio de sesión único con OAuth como Facebook o Twitter.
Instalar y configurar Passport
Lo primero que tenemos que hacer es instalar Passport y los módulos que vayamos a utilizar. Empezaremos con una autenticación contra nuestra base de datos, así que necesitamos:
npm install --save passport passport-local
Passport por defecto buscará en las peticiones el parámetro username
y password
, aunque podríamos cambiarlo, hemos optado por incluir el atributo username
al modelo User
(queda mejor que mostrar el email y podremos jugar con las rutas y el user name más adelante).
Recomiendo echarle un ojo a la Documentación de Passport local.
Una vez instalado creamos un fichero de configuración en el directorio config
llamado passport.js
, el cual será cargado por Sails automáticamente al lanzar el servidor. Para no copiar todo el fichero aquí puesto que está disponible en GitHub voy a destacar lo más importante. Indicamos a passport que use una estrategia local, buscando un usuario cuyo username
o email
coincida con el campo username de nuestro fomulario de login. Una vez encontrado el usuario comparamos las contraseñas y devolvemos el usuario.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
Unas lineas más abajo cerramos el fichero passport.js
declarando el middleware de Express y asignando a las variables locales el usuario que devolvimos en el fragmento de código anterior:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Acciones Login
y Logout
Ahora que tenemos configurado Sails para usar Passport realizamos los cambios en el controlador UserController
para utilizar este nuevo medio de autenticación. Nuestras acciones login
y logout
quedan mucho más reducidas puesto que gran parte del trabajo lo hace Passport con las funciones login
y logout
que trae implementadas.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
Políticas
Como Passport nos facilita unos cuantos métodos para gestionar la autenticación del usuario vamos a aprovecharlos para usarlos en nuestras políticas. El primero de ellos es el método isAuthenticated()
, el cual utilizaremos en la política con dicho nombre:
1 2 3 4 |
|
Y otra de las tareas que automatiza es guardar el usuario registrado en la variable req.user
, la cual usaremos para comprobar si puede administrar un usuario concreto.
1 2 3 4 |
|
Actualización de vistas
Y los últimos cambios que debemos realizar son en las vistas, los cuales enumero:
- En los condicionales ya no usaremos
session.authenticated
, si nologgedUser
. - Para obtener los datos del usuario registrado utilizaremos
loggedUser
en lugar desession.user
. - En el formulario de autenticación, utilizaremos los campos
username
ypassword
, indicando que el nombre de usuario puede ser también el correo-e. - Añadiremos el campo
username
al formulario de registro y de edición. - Mostraremos el nombre de usuario en lugar del mail en la ficha de usuario y en la barra de navegación.
Commit en GitHub: 0c201f963d: Auth with Passport. Username attr added.
Commit en GitHub: 34736d85b4: Fix session.canAdminUser using req.user. And login user on create.
Código en GitHub: building-realtime-webapp. Release: auth-passport
.
Entorno de desarrollo en Heroku: building-realtime-webapp.