Tipos de autenticación en Laravel

Clase 6 de 33Curso Avanzado de Laravel

Contenido del curso

Laravel y Base de Datos

    Resumen

    Implementa autenticación en Laravel con confianza: desde el scaffolding básico de registro con Laravel UI hasta la protección de rutas API con Laravel Sanctum, pruebas automatizadas sin errores 401 y emisión de tokens seguros con un controlador de acción única. Todo con sesiones basadas en cookies, protección CSRF y defensa ante XSS para SPA.

    Configuración de autenticación con Laravel UI y Sanctum

    Para iniciar, Laravel ofrece varios tipos de autenticación. Primero, Laravel UI brinda un scaffolding básico para registro y acceso por web. Luego, Sanctum habilita autenticación para SPA y APIs con sesiones y cookies o con tokens personales.

    ¿Cómo habilitar el scaffolding de Laravel UI?

    • Instala el paquete y publica sus recursos con vendor publish.
    • Se generan una migración y un archivo de configuración.
    • Ejecuta las migraciones para preparar la base de datos.
    php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider" php artisan migrate

    ¿Qué trait y middleware activan Sanctum para SPA?

    • En el modelo User añade el trait HasApiTokens para poder crear tokens.
    use Laravel\Sanctum\HasApiTokens; class User extends Authenticatable { use HasApiTokens; // habilita creación de tokens }
    • En el Kernel agrega el middleware de Sanctum en el grupo 'api' para solicitudes de SPA con cookies stateful, protección CSRF y defensa ante filtración de credenciales por XSS.
    protected $middlewareGroups = [ 'api' => [ \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, // ... ], ];

    ¿Cómo proteger rutas API con auth:sanctum?

    • Aplica el middleware a las rutas que quieras proteger.
    // routes/api.php Route::middleware('auth:sanctum')->get('/ruta-protegida', function () { return 'OK'; });
    • Si un cliente no está autenticado, obtendrá un 401: no autorizado.

    Pruebas de autenticación con Sanctum

    Al proteger las rutas con auth:sanctum, tus pruebas pueden fallar con 401. Sanctum provee una forma simple de simular un usuario autenticado en tests.

    ¿Qué indica un 401 en los tests?

    • Que la ruta requiere autenticación y el test no está actuando como usuario.
    • Solución: autenticar un usuario de prueba antes de la solicitud.

    ¿Cómo usar Sanctum::actingAs con factory?

    • Crea un usuario con factory y autentícalo con acting_as.
    use Laravel\Sanctum\Sanctum; use App\Models\User; Sanctum::actingAs(User::factory()->create());
    • Repite esto en cada prueba que lo requiera.

    ¿Cómo aplicar autenticación en setUp?

    • Centraliza la autenticación para toda la clase de pruebas.
    protected function setUp(): void { parent::setUp(); Sanctum::actingAs(User::factory()->create()); }
    • Resultado: las pruebas pasan al tener contexto autenticado por API.

    Generación de tokens con un Single Action Controller

    Para emitir tokens personales, crea un controlador de acción única que valide credenciales y retorne el token en formato JSON.

    ¿Cómo crear el controlador y validar el request?

    • Genera el controlador e implementa el método __invoke.
    php artisan make:controller UserTokenController
    namespace App\Http\Controllers; use App\Models\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; use Illuminate\Validation\ValidationException; class UserTokenController extends Controller { public function __invoke(Request $request) { $data = $request->validate([ 'email' => ['required', 'email'], 'password' => ['required'], 'device_name' => ['required'], ]); $user = User::where('email', $data['email'])->first();

    ¿Cómo verificar credenciales y lanzar errores?

    • Si el usuario no existe o la contraseña no coincide, lanza una excepción de validación.
    if (! $user || ! Hash::check($data['password'], $user->password)) { throw ValidationException::withMessages([ 'email' => 'El email no existe o no coincide con nuestros datos.', ]); }
    • Importa Hash por namespace y usa Hash::check para comparar la contraseña con el hash almacenado.

    ¿Cómo crear el token, ruta y probar el endpoint?

    • Crea el token con el trait HasApiTokens y retorna JSON.
    $token = $user->createToken($data['device_name'])->plainTextToken; return response()->json(['token' => $token]); } }
    • Define la ruta tipo POST hacia el controlador.
    use App\Http\Controllers\UserTokenController; Route::post('/sanctum-token', UserTokenController::class);
    • Prueba con tu HTTP client: envía email, password y device_name a la ruta configurada. Si omites la contraseña, verás un mensaje de error de validación.
    { "email": "usuario@correo.com", "password": "secreto", "device_name": "mi-dispositivo" }

    ¿Quieres que revisemos tu configuración o tu flujo de pruebas con Sanctum? Cuéntame en los comentarios qué parte te gustaría profundizar y en qué entorno estás trabajando.