CodeIgniter 4: crear un sistema de autenticación basado en tokens JWT

Guía completa para implementar autenticación stateless con JSON Web Token en CodeIgniter 4 y proteger API RESTful.

CodeIgniter 4: crear un sistema de autenticación basado en tokens JWT

En las API RESTful modernas y las aplicaciones desacopladas, como las SPA con React o Vue y las aplicaciones móviles, la autenticación tradicional basada en sesión no siempre es la opción ideal. Los JSON Web Tokens (JWT) son una solución estándar para una autenticación stateless, segura y escalable.

Por qué usar JWT con CodeIgniter 4

Integrar JWT en CodeIgniter 4 aporta varias ventajas arquitectónicas:

  • Stateless: el servidor no necesita guardar el estado de sesión en una base de datos o caché para cada solicitud.
  • Filtros nativos: los Filters de CodeIgniter 4 pueden interceptar y validar la cabecera de autorización antes de ejecutar los controladores.
  • Flexibilidad: el token contiene la carga útil firmada necesaria para identificar al usuario y sus roles.

1. Configurar la clave secreta y las dependencias

Primero instalamos la biblioteca estándar para JWT mediante Composer:

composer require firebase/php-jwt

A continuación, definimos una clave secreta robusta en el archivo .env del proyecto para firmar los tokens:

JWT_SECRET_KEY = 'la_tua_chiave_segreta_molto_lunga_e_sicura'
JWT_TIME_TO_LIVE = 3600

2. Generar el token al iniciar sesión

En el controlador de autenticación, por ejemplo AuthController.php, validamos las credenciales y, si son correctas, generamos un JWT devuelto como JSON:

request->getVar('email');
        $password = $this->request->getVar('password');

        $userModel = new \App\Models\UserModel();
        $user = $userModel->where('email', $email)->first();

        if (!$user || !password_verify($password, $user['password'])) {
            return $this->failUnauthorized('Credenziali non valide');
        }

        $key = getenv('JWT_SECRET_KEY');
        $iat = time();
        $exp = $iat + (int)getenv('JWT_TIME_TO_LIVE');

        $payload = [
            'iss'  => 'athesis_api',
            'sub'  => $user['id'],
            'iat'  => $iat,
            'exp'  => $exp,
            'email'=> $user['email']
        ];

        $token = JWT::encode($payload, $key, 'HS256');

        return $this->respond([
            'status'   => 200,
            'message'  => 'Login effettuato con successo',
            'token'    => $token,
            'expires'  => $exp
        ]);
    }
}

3. Proteger las rutas con un filtro JWT

Para validar el token en cada solicitud protegida, creamos un filtro en App/Filters/JWTAuthFilter.php:

getHeaderLine('Authorization');
        $token = null;

        if (!empty($header) && preg_match('/Bearer\s(\S+)/', $header, $matches)) {
            $token = $matches[1];
        }

        if (!$token) {
            return service('response')
                ->setStatusCode(401)
                ->setJSON(['message' => 'Token di accesso mancante o non valido']);
        }

        try {
            $key = getenv('JWT_SECRET_KEY');
            $decoded = JWT::decode($token, new Key($key, 'HS256'));
        } catch (Exception $e) {
            return service('response')
                ->setStatusCode(401)
                ->setJSON(['message' => 'Token scaduto o non autorizzato: ' . $e->getMessage()]);
        }
    }

    public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
    {
    }
}

Conclusión

JWT permite crear en CodeIgniter 4 una arquitectura API limpia y ligera, preparada para cualquier frontend moderno. Los filtros nativos y Firebase PHP-JWT simplifican la gestión y el mantenimiento de las rutas protegidas.

Fuentes oficiales

Compartir

¿Cuál es tu reacción?

Me gusta Me gusta 0
No me gusta No me gusta 0
Me encanta Me encanta 0
Divertido Divertido 0
Enfadado Enfadado 0
Triste Triste 0
¡Vaya! ¡Vaya! 0