Guía Paso a Paso: Implementación de Autenticación JWT en Laravel y Lumen


Victor Arana Flores

08 Aug 2023

Si deseas mejorar la seguridad y autenticación de tu aplicación Laravel, puedes integrar JWT (JSON Web Tokens) siguiendo estos pasos:

Instalación mediante Composer:

Comienza por obtener la última versión del paquete JWT-Auth utilizando Composer. Ejecuta el siguiente comando en tu terminal:

composer require tymon/jwt-auth

Agregar el Proveedor de Servicios (para Laravel 5.4 o versiones anteriores):

Para integrar JWT-Auth, debes incluir el proveedor de servicios en la configuración de Laravel. Abre el archivo config/app.php y encuentra el array 'providers'. Inserta la siguiente línea:

'providers' => [

    ...

    Tymon\JWTAuth\Providers\LaravelServiceProvider::class,
],

Publicar la Configuración:

Para personalizar la configuración del paquete JWT-Auth, puedes publicar el archivo de configuración. Ejecuta el siguiente comando para publicar el archivo de configuración:

php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"

Esta acción creará un archivo config/jwt.php donde podrás configurar varios aspectos del paquete.

Generar una Clave Secreta:

Una clave secreta es esencial para la firma de tokens. Puedes crear una fácilmente utilizando la herramienta de línea de comandos Artisan de Laravel. Ejecuta el siguiente comando:

php artisan jwt:secret

Este comando actualizará automáticamente tu archivo .env con una nueva clave, similar a JWT_SECRET=foobar. Esta clave es fundamental para la encriptación de tokens, y el algoritmo específico utilizado dependerá de la configuración que elijas.

Actualizar el Modelo de Usuario

Ahora debes implementar el contrato Tymon\JWTAuth\Contracts\JWTSubject en tu modelo de usuario (User). Esto requiere la implementación de los métodos getJWTIdentifier() y getJWTCustomClaims().

El siguiente ejemplo te dará una idea de cómo podría verse esto. Por supuesto, debes realizar los cambios necesarios para adaptarlo a tus propias necesidades.

<?php

namespace App;

use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements JWTSubject
{
    use Notifiable;

    // Resto del código omitido por brevedad

    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

    public function getJWTCustomClaims()
    {
        return [];
    }
}

Configurar el Guardia de Autenticación

Dentro del archivo config/auth.php, necesitas realizar algunos cambios para configurar Laravel para usar el guardia jwt en la autenticación de tu aplicación.

Realiza los siguientes cambios en el archivo:

'defaults' => [
    'guard' => 'api',
    'passwords' => 'users',
],

...

'guards' => [
    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],

Aquí le decimos al guardia 'api' que use el controlador 'jwt', y establecemos el guardia 'api' como el predeterminado.

Agregar Rutas Básicas de Autenticación

Añadamos algunas rutas en el archivo routes/api.php de la siguiente manera:

Route::post('auth/login', [AuthController::class, 'login']);
Route::post('auth/logout', [AuthController::class, 'logout']);
Route::post('auth/refresh', [AuthController::class, 'refresh']);
Route::post('auth/me', [AuthController::class, 'me']);

Crear el Controlador de Autenticación

Luego, crea el controlador AuthController ejecutando el comando artisan:

php artisan make:controller AuthController

Luego, agrega lo siguiente:

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Routing\Controllers\HasMiddleware;
use Illuminate\Routing\Controllers\Middleware;

class AuthController extends Controller implements HasMiddleware
{
    public static function middleware(): array
    {
        return [
            new Middleware('auth:api', except: ['login']),
        ];
    }

    public function login()
    {
        $credentials = request(['email', 'password']);

        if (! $token = auth()->attempt($credentials)) {
            return response()->json(['error' => 'No autorizado'], 401);
        }

        return $this->respondWithToken($token);
    }

    public function me()
    {
        return response()->json(auth()->user());
    }

    public function logout()
    {
        auth()->logout();

        return response()->json(['mensaje' => 'Cierre de sesión exitoso']);
    }

    public function refresh()
    {
        return $this->respondWithToken(auth()->refresh());
    }

    protected function respondWithToken($token)
    {
        return response()->json([
            'access_token' => $token,
            'token_type' => 'bearer',
            'expires_in' => auth()->factory()->getTTL() * 60
        ]);
    }
}

Con estos pasos, podrás autenticar las solicitudes de tu aplicación usando JWT. Este token se puede usar para realizar solicitudes autenticadas a tu aplicación.

Conclusiones:

En esta guía, hemos recorrido paso a paso la implementación de la autenticación JSON Web Token (JWT) en tus aplicaciones Laravel y Lumen. JWT ofrece una solución segura y eficiente para gestionar la autenticación de usuarios, permitiéndote mejorar la seguridad de tus aplicaciones mientras mantienes una experiencia de usuario fluida.

Al implementar JWT en tu aplicación, has logrado los siguientes beneficios clave:

Mayor Seguridad: JWT proporciona un método robusto de autenticación y cifrado, asegurando que solo los usuarios autorizados puedan acceder a recursos y funciones protegidos.

Sencilla Integración: Gracias a las bibliotecas y paquetes disponibles, como tymon/jwt-auth, la implementación de JWT se vuelve accesible incluso para desarrolladores con menos experiencia en seguridad.

Eficiencia en la Autenticación: Al evitar la necesidad de consultas de base de datos constantes para cada solicitud, JWT permite una autenticación más eficiente y reduce la carga en tu aplicación.

Flexibilidad Personalizada: Puedes personalizar las reclamaciones y configuraciones JWT para adaptarse a las necesidades específicas de tu aplicación, ofreciendo un nivel de flexibilidad que se adapta a tus requerimientos.

Recuerda, el uso de JWT no solo garantiza la seguridad de la información sensible, sino que también mejora la experiencia del usuario al agilizar el proceso de autenticación. A medida que te familiarices con la implementación de JWT en tus proyectos, podrás aprovechar su potencial completo para crear aplicaciones web más seguras y eficientes.

En resumen, con esta guía has aprendido cómo implementar la autenticación JWT en Laravel y Lumen, lo que te permitirá construir aplicaciones más seguras, confiables y eficientes. Continúa explorando las posibilidades de JWT y sigue mejorando tus habilidades de desarrollo para brindar soluciones de vanguardia en el mundo en constante evolución de la programación web.


3 comentarios

Inicia sesión para comentar

Comentarios:

  • Yoan Estrada Blanco

    Yoan Estrada Blanco hace 7 meses

    Como podria complementar esto con cokkies httpOnly

  • Pablo Rojas

    Pablo Rojas hace 10 meses

    me pasa algo exrtaño, si hago todo tal cual esta aca, el login normal por web no funciona, o sea, vuelve contantemente al formulario de login

  • Danilo

    Danilo hace 1 año

    No me había fijado del blog. Esta super bien explicado