Dans le développement web moderne, l'authentification des utilisateurs est une composante essentielle des applications sécurisées. La bibliothèque jwt-auth fournit une solution robuste et efficace pour Laravel, basée sur les JSON Web Tokens (JWT). Cet article explique comment intégrer et configurer cet outil pour ajouter une authentification fiable à votre application.
Avantages principaux de jwt-auth
Conçu spécifiquement pour Laravel et Lumen, jwt-auth exploite les JWT pour une authentification sans état. Ses principaux atouts sont :
- Architecture sans état : Aucune session n'est stockée côté serveur, ce qui réduit la charge.
- Interopérabilité : Fonctionne efficacement entre différents domaines et services.
- Adapté aux applications mobiles et SPA : Idéal pour les architectures découplées.
- Extensible : Supporte plusieurs méthodes d'authentification et pilotes de stockage.
Procédure d'installation
L'installation s'effectue en quelques étapes simples via Composer.
1. Installation du paquet :
composer require tymon/jwt-auth
2. Publication de la configuration (commande Artisan) :
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
3. Génération de la clé secrète :
php artisan jwt:secret
Cette commande ajoute la clé JWT_SECRET à votre fichier .env.
Configuraton essentielle
Le fichier config/jwt.php centralise les paramètres importants :
- Durée de vie du jeton (
ttl) : Par défaut à 60 minutes. - Durée de vie du jeton de rafraîchissement (
refresh_ttl) : Permet de renouveler le jeton sans reconnecter l'utilisateur. - Algorithme de chiffrement : Supporte HMAC SHA256, RSA, etc.
Implémentation du flux d'authentification
Créez d'abord un contrôleur dédié :
php artisan make:controller AuthJWTController
Implémentez la méthode de connexion :
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
public function authentifier(Request $requete)
{
$identifiants = $requete->only('email', 'mot_de_passe');
$jeton = Auth::guard('api')->attempt($identifiants);
if (!$jeton) {
return response()->json(['erreur' => 'Identifiants invalides'], 401);
}
return $this->repondreAvecJeton($jeton);
}
protected function repondreAvecJeton($jeton)
{
return response()->json([
'jeton_acces' => $jeton,
'type_jeton' => 'bearer',
'expire_dans' => Auth::guard('api')->factory()->getTTL() * 60
]);
}
Définissez les routes correspondantes dans routes/api.php :
Route::post('/connexion', [AuthJWTController::class, 'authentifier']);
Route::post('/rafraichir-jeton', [AuthJWTController::class, 'rafraichir']);
Route::middleware('auth:api')->get('/utilisateur', function (Request $requete) {
return $requete->user();
});
Rafraîchissement des jetons
Pour éviter des déconnexions fréquentes, utilisez le mécanisme de rafraîchissement :
public function rafraichir()
{
$nouveauJeton = Auth::guard('api')->refresh();
return $this->repondreAvecJeton($nouveauJeton);
}
Vous pouvez également invalider l'ancien jeton explicitement :
$jetonRafraichi = Auth::guard('api')->refresh(true, true);
Ressources complémentaires
Le répertoire docs/ du projet contient la documentation officielle détaillant les gardes d'authentification et la gestion des exceptions. Des exemples de tests sont disponibles dans le dossier tests/.