Joskar Andres Hernandez
Mariano Gastón Paduani
Muy buena practica usar los FormRequest!
¿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.
Route::post('login', [App\Http\Controllers\API\LoginController::class, 'login']);
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.
use Laravel\Sanctum\HasApiTokens; class User extends Authenticatable { use HasApiTokens; // 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.
public function login(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.
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; class LoginController extends Controller { // Metodo que recibe el formulario public function login(Request $request) { $this->validateLogin($request); // Login true // Login false } // Metodo que verifica que llegue la informacion correctamente public function validateLogin(Request $request) { return $request->validate([ 'email' => 'required|email', 'password' => 'required', 'name' => 'required' ]); } }
Joskar Andres Hernandez
Mariano Gastón Paduani
Muy buena practica usar los FormRequest!
Juan Pablo Campuzano Monsalve
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.
Harold German Granados Guerrero
Okey perfecto, pero falta el codigo para cerrar o destruir la sesion
Elvis Milan
Auth
Ermilo Silvino Juárez Gordillo
Juan Guillermo Perez Cardozo
a veces decimos sencillo y terminamos generando 4 archivos con 3 lineas cada uno. meter mejor eso en el metodo login y listo
IRIDIAN GUADALUPE CARRERA MONDRAGÓN
php artisan make:controller Api/LoginController
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; class LoginRequest extends FormRequest { public function rules() { return [ 'email' => 'required|email', 'password' => 'required', 'name' => 'required' ]; } public function messages() { 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' ]; } }
Entonces en el controllador ponen lo siguiente
<?php namespace App\Http\Controllers\Api; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use App\Models\User; use App\Http\Requests\LoginRequest; class LoginController extends Controller { public function login(LoginRequest $request) { if(Auth::attempt($request->only('email', 'password'))) { return response()->json([ 'token' => $request->user()->createToken($request->name)->plainTextToken, 'message' => 'Success' ]); } else { return response()->json([ 'message' => 'Unhautorized' ], 401); } } }
importan el LoginRequest desde donde lo guardaron y lo pasan como parametro al metodo en el controlador, automaticamente hata las validaciones.
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; class LoginController extends Controller { public function login(Request $request) { $validator = $this->validateLogin($request); if ($validator->fails()) { //login fails: do anything } else { // login success: do something } } public function validateLogin(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; } }