Sistema de autenticación sin contraseña en Laravel

Hoy vamos a ver como hacer un sistema de autenticación sin contraseña en Laravel. Hace un tiempo me pregunté cómo se haría esto en Laravel y encontré un post en Medium dónde lo explicaba de una manera muy sencilla (post en el que me he basado para hacer éste).

El sistema de autenticación sin contraseña funciona de la siguiente manera: simplemente tenemos que indicar nuestro email cuando nos registramos, se nos enviará un correo con un enlace con fecha de caducidad (si caduca, quedará inválido) y cuando entremos en este enlace, nos logueará automáticamente, sin contraseñas.

Nota: yo voy a hacer esta entrada con una instalación limpia de Laravel 5.8

Primero de todo, lo que vamos a hacer va a ser eliminar de las migraciones de la tabla users el campo password:

Después, también tenemos que eliminar la migración de password_resets porque no la vamos a utilizar.

Una vez tenemos esto, ejecutamos las migraciones:

 

Ahora vamos a las vistas tanto del login como del registro y eliminamos los campos de password. Hemos de tener en cuenta que el de registro, también tenemos que eliminar el de confirmación de la contraseña. No los voy a poner poner porque quedaría muy largo el post.

 

También tenemos que quitar el campo password del modelo de usuario:

 

Vamos a modificar los controladores. El primero que vamos a modificar va a ser el de registro. Los métodos validator y create deberían quedar así:

 

Probamos que el registro funcione correctamente:

Funciona correctamente sin poner ninguna contraseña.

 

Ahora vamos a modificar el controlador del login. Lo primero que vamos a hacer va a ser sobreescribir dos métodos (validateLogin y login) que quedarán así:

En el validateLogin lo que estamos haciendo es eliminar de la validación el campo password, ya que lo hemos eliminado de la vista y de la base de datos.

Y en el login lo que estamos haciendo es validar los datos que nos llegan, obtener el usuario a partir del email, generar una url temporal y enviar un email con esta url temporal. Para recibir y ver el email, estoy utilizando Mailtrap.io, si quieres ver como configurarlo echa un vistazo a este post.

Nota: Si la versión de Laravel que tienes es menor a la 5.6.12 no podréis utilizar las url temporales, así que lo tendréis que hacer, por ejemplo, como se hace aquí. Generando una tabla con tokens y comprobar si ese token hace más de X tiempo que se ha generado.

Una vez tenemos esto, vamos a crear la vista del email en views/mails/login-passwordless.blade.php y le ponemos el siguiente contenido:

Recuerda publicar las vistas de laravel-mail con php artisan vendor:publish tag=laravel-mail .

 

Creamos las rutas necesarias que serán dos: una para el mensaje de información diciendo que se ha enviado un correo a tu email y la otra para la url temporal utilizada anteriormente.

Como ves, la primera ruta que es la de el mensaje de aviso, como no tiene ninguna lógica, lo que se hace es crear una ruta que muestre la vista directamente, para ello utilizamos Route::view. Creamos la vista en views/auth/check-email.blade.php y le ponemos el siguiente código:

Con todo esto ya debería estar todo funcionando. Vamos a probarlo:

 

-


Aloja tu proyecto en DigitalOcean: Obtén $200 de crédito gratis al registrarte a través de este enlace.

Si hay cualquier tipo de error en el post o te surge cualquier duda, no dudes en ponerlo en los comentarios o enviarme un correo desde la página de contacto.

? CONTACTAR

Deja una respuesta

  Acepto la política de privacidad