Qu’est-ce que Passport
Laravel Passport est le package officiel qui permet à une application Laravel de fonctionner comme un serveur d’autorisation OAuth2.
Il est utilisé pour l’intégration d’applications tierces ou pour les API qui nécessitent un flux OAuth2 strict.
Passport vs Sanctum
Si OAuth2 est indispensable, choisissez Passport.
Si vous cherchez simplement une authentification par token d’API ou pour une SPA / mobile, choisissez Sanctum.
| Aspect | Passport | Sanctum |
|---|
| Objectif | Implémentation d’un serveur OAuth2 | Authentification API simple |
| Cas d’usage | Intégration d’applis externes, conformité OAuth2 | SPA maison, mobile, tokens personnels |
| Complexité | Élevée | Faible |
Installation
La recommandation officielle sous Laravel 13 est install:api --passport.
php artisan install:api --passport
Pour une installation manuelle dans un projet existant, ces commandes fonctionnent aussi.
composer require laravel/passport
php artisan passport:install
Lors du premier déploiement, il peut être utile de ne générer que les clés.
php artisan passport:keys
Configuration
Modèle User
Ajoutez le trait HasApiTokens et l’interface OAuthenticatable à votre modèle User.
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Passport\Contracts\OAuthenticatable;
use Laravel\Passport\HasApiTokens;
class User extends Authenticatable implements OAuthenticatable
{
use HasApiTokens, HasFactory, Notifiable;
}
Garde d’authentification
Dans config/auth.php, utilisez le driver passport pour la garde api.
'guards' => [
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
Configuration du service provider
Dans la méthode boot() de AppServiceProvider, vous pouvez définir les portées et la durée de vie des tokens.
use Carbon\CarbonInterval;
use Laravel\Passport\Passport;
public function boot(): void
{
Passport::tokensCan([
'orders:read' => 'Consulter les commandes',
'orders:create' => 'Créer des commandes',
]);
Passport::defaultScopes(['orders:read']);
Passport::tokensExpireIn(CarbonInterval::days(15));
Passport::refreshTokensExpireIn(CarbonInterval::days(30));
Passport::personalAccessTokensExpireIn(CarbonInterval::months(6));
}
Gestion des clients
Client pour l’authorization code grant
php artisan passport:client
Ce type de client s’utilise dans le flux OAuth2 standard avec écran de consentement utilisateur.
Client pour le client credentials grant
php artisan passport:client --client
Pour les endpoints de communication de machine à machine, utilisez le middleware EnsureClientIsResourceOwner.
use Laravel\Passport\Http\Middleware\EnsureClientIsResourceOwner;
Route::get('/orders', function () {
// ...
})->middleware(EnsureClientIsResourceOwner::using('orders:read'));
Gestion des tokens
Attribution de portées
$accessToken = $user->createToken(
'dashboard-token',
['orders:read', 'orders:create']
)->accessToken;
Vérification des portées
use Laravel\Passport\Http\Middleware\CheckToken;
Route::get('/orders', function () {
// ...
})->middleware(['auth:api', CheckToken::using('orders:read')]);
Révocation
use Laravel\Passport\Passport;
$token = Passport::token()->find($tokenId);
$token?->revoke();
Protection des routes API
Pour protéger une API avec un access token d’utilisateur, ajoutez auth:api.
Route::middleware('auth:api')->group(function () {
Route::get('/user', fn (Request $request) => $request->user());
Route::get('/orders', [OrderController::class, 'index']);
});
Pour les routes utilisant le client credentials grant, utilisez EnsureClientIsResourceOwner et non auth:api.
Personal Access Token
Adapté aux cas où l’utilisateur émet lui-même son token d’API, sans passer par le flux OAuth2 complet.
php artisan passport:client --personal
$token = $request->user()->createToken('cli-token', ['orders:read'])->accessToken;
Si votre usage principal est le Personal Access Token, la documentation officielle Laravel recommande de considérer Sanctum.
Liens associés