Autenticación de Usuarios con Laravel y Tokens API
Resumen
¿Cómo podemos configurar la autenticación en nuestra API con Laravel?
Implementar un sistema de autenticación es esencial para controlar el acceso a los datos en una API. En este caso, estamos configurando la autenticación en un proyecto Laravel utilizando un controlador específico y autenticación basada en tokens. Aquí exploraremos paso a paso cómo configurar todo el sistema para permitir que aplicaciones de terceros se conecten de manera segura.
¿Cómo se crea un controlador para gestionar el acceso?
En Laravel, los controladores son fundamentales para manejar solicitudes HTTP. En este proceso, utilizamos un controlador para gestionar los inicios de sesión.
php artisan make:controller API/LoginController
Este comando crea un nuevo controlador dentro del directorio API, genérico para manejar cualquier versión de nuestra API. Esto nos proporciona flexibilidad para cambiar o actualizar las versiones de autenticación cuando sea necesario.
¿Cuál es la configuración de las rutas?
Para permitir la autenticación, las rutas deben estar configuradas para dirigir las solicitudes al controlador adecuado. Esto se logra mediante la definición de rutas POST, ya que se trata de enviar formularios de inicio de sesión.
Esta línea de código vincula la solicitud POST a nuestro método login en LoginController. Es crucial para gestionar los datos que las aplicaciones envían cuando intentan autenticarse.
¿Cómo se configura el modelo de usuario para tokens?
En el modelo de usuario, es fundamental indicar que utilizaremos un sistema basado en tokens. Esto se logra mediante el uso de la clase HasApiTokens de Laravel.
useLaravel\Sanctum\HasApiTokens;classUserextendsAuthenticatable{useHasApiTokens;// Código adicional del modelo}
El uso de HasApiTokens permite a nuestro sistema gestionar los tokens de API necesarios para el inicio de sesión y autenticación.
¿Cómo se maneja la validación dentro del controlador?
La validación es esencial para verificar que la información de inicio de sesión sea correcta antes de continuar el proceso. Se define un método específico dentro del controlador para este propósito.
publicfunctionlogin(Request$request){$validatedData=$request->validate(['email'=>'required|email','password'=>'required','name'=>'required']);// Lógica adicional para validar y autenticar al usuario}
Este método validate verifica que el email esté en el formato correcto y que los campos requeridos estén presentes. Además, incluye un campo personalizado para identificar desde qué dispositivo o software el usuario se está conectando, lo que proporciona una capa adicional de seguridad y personalización.
¿Qué hacer si el login es exitoso o falla?
La lógica de negocio dentro del método login debe definir qué acciones tomar dependiendo de si las credenciales proporcionadas son correctas o no.
Si es exitoso: Retornar un token que permita acceso continuo sin repetir el inicio de sesión en cada solicitud.
Si falla: Proporcionar un mensaje de error claro para que el usuario sepa que debe verificar sus credenciales.
Este flujo asegura que solamente los usuarios autenticados puedan acceder a los datos protegidos de la API, salvaguardando así la información sensible.
Conclusión y recomendaciones adicionales
La autenticación segura es vital para cualquier aplicación que maneje datos sensibles. Usar un enfoque basado en tokens proporciona un control adicional sobre quién tiene acceso a tu sistema. Siempre asegúrate de mantener tus métodos de autenticación actualizados con las últimas pautas de seguridad. Implementar estos pasos te ayudará a crear una base sólida para tu sistema de autenticación en Laravel.
Comparto el código del archivo:
App/Http/Controllers/Api/LoginController.php
<?php
namespace App\Http\Controllers\Api;use App\Http\Controllers\Controller;use Illuminate\Http\Request;use App\Models\User;use Illuminate\Support\Facades\Auth;classLoginControllerextendsController{// Metodo que recibe el formulariopublicfunctionlogin(Request $request){ $this->validateLogin($request);// Login true// Login false}// Metodo que verifica que llegue la informacion correctamentepublicfunctionvalidateLogin(Request $request){return $request->validate(['email'=>'required|email','password'=>'required','name'=>'required']);}}
Gracias compañero :D
En lo personal me agrada más separar todo en su propio archivo!
Como un feature extra pueden tener una clase que se encargue de validar el Request de la siguiente manera
<?php
namespace App\Http\Requests;use Illuminate\Foundation\Http\FormRequest;classLoginRequestextendsFormRequest{publicfunctionrules(){return['email'=>'required|email','password'=>'required','name'=>'required'];}publicfunctionmessages(){return['email.required'=>'The email is required, test','email.email'=>'The email must be valid','password.required'=>'The password is required','name.required'=>'The name is required'];}}
importan el LoginRequest desde donde lo guardaron y lo pasan como parametro al metodo en el controlador, automaticamente hata las validaciones.
Muy buena practica usar los FormRequest!
Yo por ejemplo, solo por tema de gusto, cada persona lo haría como quisiese, llamaría al controlador AuthController, creo que engloba mejor ambos métodos.
Okey perfecto, pero falta el codigo para cerrar o destruir la sesion
Auth
Usando Validator:make() para mensajes personalizados:
<?php
namespace App\Http\Controllers\Api;use App\Http\Controllers\Controller;use Illuminate\Http\Request;use App\Models\User;use Illuminate\Support\Facades\Auth;use Illuminate\Support\Facades\Validator;classLoginControllerextendsController{publicfunctionlogin(Request $request){ $validator = $this->validateLogin($request);if($validator->fails()){//login fails: do anything}else{// login success: do something}}publicfunctionvalidateLogin(Request $request){ $validator =Validator::make($request->all(),['email'=>'required|email','password'=>'required','name'=>'required'],['email.required'=>'The Email field is required','email.email'=>'The Email is not a valid email','password.required'=>'The Password field is required','name.required'=>'The Name field is required']);return $validator;}}
a veces decimos sencillo y terminamos generando 4 archivos con 3 lineas cada uno. meter mejor eso en el metodo login y listo