CodeIgniter 4 : créer un système d'authentification par jetons JWT
Guide complet pour mettre en œuvre une authentification stateless avec JSON Web Token dans CodeIgniter 4 et protéger des API RESTful.
Pour les API RESTful modernes et les applications découplées, notamment les SPA React ou Vue et les applications mobiles, l'authentification classique par session n'est pas toujours idéale. Les JSON Web Tokens (JWT) constituent une solution standard pour une authentification stateless, sûre et évolutive.
Pourquoi utiliser JWT avec CodeIgniter 4 ?
L'intégration de JWT dans CodeIgniter 4 offre plusieurs avantages architecturaux :
- Stateless : le serveur n'a pas besoin d'enregistrer l'état de session en base de données ou en cache pour chaque requête.
- Filtres natifs : les Filters de CodeIgniter 4 peuvent intercepter et valider l'en-tête d'autorisation avant l'exécution des contrôleurs.
- Souplesse : le jeton contient la charge utile signée nécessaire pour identifier l'utilisateur et ses rôles.
1. Configurer la clé secrète et les dépendances
Installez d'abord la bibliothèque JWT standard avec Composer :
composer require firebase/php-jwt
Définissez ensuite une clé secrète robuste dans le fichier .env du projet afin de signer les jetons :
JWT_SECRET_KEY = 'la_tua_chiave_segreta_molto_lunga_e_sicura'
JWT_TIME_TO_LIVE = 3600
2. Générer le jeton lors de la connexion
Dans le contrôleur d'authentification, par exemple AuthController.php, vérifiez les identifiants et générez un JWT renvoyé au format JSON lorsqu'ils sont corrects :
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. Protéger les routes avec un filtre JWT
Pour valider le jeton lors de chaque requête protégée, créez un filtre dans 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)
{
}
}
Conclusion
JWT permet de bâtir dans CodeIgniter 4 une architecture d'API claire et légère, prête à s'intégrer à tout frontend moderne. Les filtres natifs associés à Firebase PHP-JWT simplifient la gestion et la maintenance des routes protégées.
Sources officielles
Partager
Quelle est votre réaction ?
Aimer
0
Je n'aime pas
0
Amour
0
Drôle
0
En colère
0
Triste
0
Waouh
0