CodeIgniter 4: Creare un sistema di autenticazione basato su Token JWT
Guida completa all'implementazione di un sistema di autenticazione stateless con JSON Web Token (JWT) in CodeIgniter 4 per proteggere le tue API RESTful.
Nello sviluppo di API RESTful moderne e applicazioni disaccoppiate (come SPA in React, Vue o app mobile), l'autenticazione basata su sessione tradizionale non è sempre la scelta ideale. I JSON Web Token (JWT) rappresentano la soluzione standard per gestire l'autenticazione in modo stateless, sicuro e scalabile.
Perché scegliere JWT con CodeIgniter 4
L'integrazione dei JWT in CodeIgniter 4 offre diversi vantaggi architetturali:
- Stateless: Il server non deve salvare lo stato della sessione nel database o in cache per ogni richiesta.
- Filtri nativi: I filtri di CodeIgniter 4 (Filters) permettono di intercettare e convalidare facilmente l'header di autorizzazione prima di eseguire i controller.
- Flessibilità: Il token contiene le informazioni necessarie (payload) per identificare l'utente e i suoi ruoli in modo crittografato.
1. Configurazione della chiave segreta e delle dipendenze
Per iniziare, installiamo la libreria standard per la gestione dei token JWT tramite Composer:
composer require firebase/php-jwt
Successivamente, definiamo una chiave segreta robusta nel file .env del progetto per firmare i token:
JWT_SECRET_KEY = 'la_tua_chiave_segreta_molto_lunga_e_sicura'
JWT_TIME_TO_LIVE = 3600
2. Generazione del Token al Login
Nel controller di autenticazione (es. AuthController.php), verifichiamo le credenziali dell'utente e, se corrette, generiamo il token JWT restituitolo in formato 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. Proteggere le rotte con un Filtro JWT
Per validare il token ad ogni richiesta protetta, creiamo un filtro in 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)
{
}
}
Conclusioni
Utilizzare JWT in CodeIgniter 4 consente di strutturare un'architettura API pulita, leggera e pronta all'integrazione con qualsiasi frontend moderno. Con la combinazione di Filter nativi e la libreria Firebase JWT, la sicurezza delle rotte risulta estremamente semplice da gestire e manutenere.
Fonti ufficiali
Share
What's Your Reaction?
Like
0
Cancella like
0
Amore
0
Buffo
0
arrabbiato
0
Sad
0
Wow
0