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.
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
0
No me gusta
0
Me encanta
0
Divertido
0
Enfadado
0
Triste
0
¡Vaya!
0