Web API con Laravel y PHP - Parte 2

Web API con Laravel y PHP - Parte 2

En la parte 1 aprendimos cómo crear modelos, vistas y controladores para un API que maneja entradas de blog construido con PHP y Laravel. Ahora nos enfocaremos en otra parte fundamental de la construcción de APIs: el registro y autenticación de usuarios.

Aprenderás cuáles herramientas ofrece Laravel y cómo utilizarlas para crear y manejar tokens de autenticación con facilidad, así como utilizarlos para servir información privada sólo a los usuarios que les pertenece.

Este tutorial partirá del código generado durante la parte 1.

Registro de usuarios

Crear un registro de usuarios en Laravel es sencillo si manejamos los componentes correctos. Afortunadamente, Laravel ya cuenta con un paquete preinstalado llamado Sanctum que nos facilita mucho el trabajo, así como un modelo User preconfigurado para manejar tokens de autenticación.

Para crear un endpoint de registro necesitamos primero crear un nuevo controlador que maneje usuarios. Este siguiente comando creará el archivo UserController.php:

sail artisan make:controller UserController --model=user --api

También necesitamos un nuevo resource que nos permita crear una representación JSON de un usuario para regresarla mediante el API:

sail artisan make:resource UserResource

En el resource, haremos algo similar a lo que hicimos en la parte 1, pero ahora con las propiedades de id, correo electrónico y nombre de usuario:

Dentro del controlador UserController, llenaremos el método store con todo y validación de datos justo como aprendimos en la parte 1. Con esto, Laravel revisará que los correos electrónicos sean válidos y que no exista otro usuario con el mismo correo previamente registrado.

Observa cómo el password es primero procesado con bcrypt antes de almacenarse. Esto evitará tener las contraseñas en texto abierto en la base de datos, lo cual sería una vulnerabilidad importante en el sistema.

Finalmente, agregaremos la ruta de registro en api.php, apuntando al método store que acabamos de implementar.

Observa cómo la agregamos bajo el prefijo de users, esto es para que todas nuestras rutas de manejo de usuarios tengan la misma estructura de URL.

Con esto listo, crearemos un usuario de prueba desde la consola:

Observarás cómo el API nos va a devolver un JSON que representa al usuario que acabamos de crear.

Listo. Ya contamos con nuestro endpoint de registro. Para el siguiente paso, asegúrate de crear por lo menos un usuario para poder probar su autenticación.

Autenticación de usuarios

Después de registrar usuarios, necesitamos un endpoint adicional para hacer el proceso de autenticación. En pocas palabras, necesitamos una forma de que los usuarios nos den su correo electrónico y contraseña para regresarles un token de autenticación si los datos de acceso proporcionados son válidos. Ese token será utilizado en llamadas posteriores para realizar consultas de información que pertenezca sólo a ese usuario.

Primero, necesitamos crear un nuevo método en nuestro UserController llamado login. Este utilizará la fachada de Auth para verificar si existe un usuario con esa combinación de correo y contraseña y, en caso de que exista, nos devolverá un token de autenticación válido.

Agregaremos una nueva ruta al prefijo users para poder llamar este nuevo endpoint en api.php:

Ahora sí, intentaremos iniciar sesión con el usuario que registramos durante el paso anterior:

Notaremos que la respuesta nos entrega un token como el siguiente:

Es posible generar más de 1 token válido, ya que debemos ser capaces de autenticar a nuestro usuario desde más de un dispositivo al mismo tiempo.

Guardaremos este token para utilizarlo en el siguiente paso.

Autorización con token

Ahora, probaremos creando un nuevo endpoint que requiera de un token válido para ser utilizado: haremos uno que nos entregue los datos del usuario actualmente autenticado en el API.

Necesitaremos que este endpoint falle si no hay un token válido presente en la petición y que utilice este mismo token para obtener el usuario correcto. Afortunadamente, Laravel Sanctum hace prácticamente todo de forma automática.

Primero, crearemos un nuevo método en UserController llamado me, que simplemente consulte el usuario actual. El llamado a auth() automáticamente revisará el token recibido en la petición para obtener el usuario relevante.

Agregaremos la nueva ruta a api.php. Observa cómo ahora utilizamos el middleware auth:sanctum para esta ruta. Esto es importante ya que toda ruta que declaremos dentro de este grupo utilizará los tokens de autenticación de forma transparente para validar el acceso.

Ahora, probaremos con el token que generamos en el paso anterior. Observa cómo es necesario enviarlo mediante el encabezado de Authorization como Bearer token.

Funciona perfectamente. Este es un ejemplo de respuesta que debemos esperar:

Intenta crear nuevos usuarios y nuevos tokens y llama a este endpoint con datos distintos para que observes cómo funciona y para que valides que efectivamente falla cuando el token que envías no es válido.

Cerrar sesión

Finalmente trabajaremos en un endpoint para eliminar la autenticación del usuario. Para cerrar sesión, sólo necesitamos que este endpoint destruya los tokens previamente creados por Sanctum.

Comenzamos por crear el nuevo método logout en UserController:

Agrega ahora su ruta a api.php, igualmente bajo el middleware de auth:sanctum:

Finalmente, intenta llamarlo con un token válido.

Conclusión

En esta ocasión aprendimos a crear diferentes endpoints para autenticación de usuarios, los cuales nos permitieron crear tokens, usarlos para obtener información privada, y finalmente destruirlos para cerrar sesión.

En la siguiente parte, aprenderemos cómo utilizar estos mismos tokens para manejar entradas de blog y cómo permitir solo a autores modificar las que pertenecen a ellos.

⚠️
Las opiniones y comentarios emitidos en este artículo son propiedad única de su autor y no necesariamente representan el punto de vista de Revelo.

Revelo Content Network da la bienvenida a todas las razas, etnias, nacionalidades, credos, géneros, orientaciones, puntos de vista e ideologías, siempre y cuando promuevan la diversidad, la equidad, la inclusión y el crecimiento profesional de los profesionales en tecnología.