Hướng Dẫn Laravel Passport
Laravel Passport là một triển khai OAuth2 server đầy đủ cho ứng dụng Laravel của bạn chỉ trong vài phút. Nó được xây dựng trên nền tảng League OAuth2 server.
Khi Nào Sử Dụng Passport?
Sử dụng Passport nếu bạn cần hỗ trợ các tính năng OAuth2 như:
- Ứng dụng bên thứ ba truy cập API của bạn thay mặt người dùng.
- Client first-party (SPA, Mobile App) cần truy cập bảo mật.
- Các loại grant khác nhau (Authorization Code, Client Credentials, Password Grant, v.v.).
Nếu bạn chỉ cần xác thực token đơn giản cho SPA hoặc mobile app, hãy cân nhắc Laravel Sanctum thay thế vì nó đơn giản hơn.
Bước 1: Cài Đặt
Cài đặt Passport qua Composer:
composer require laravel/passport
Bước 2: Chạy Migrations
Passport đi kèm với các database migrations riêng để tạo bảng cho clients và tokens.
php artisan migrate
Bước 3: Cài Đặt Passport
Lệnh này sẽ tạo các encryption keys cần thiết để sinh access tokens bảo mật và tạo clients "personal access" và "password grant".
php artisan passport:install
Bước 4: Cấu Hình User Model
Thêm trait HasApiTokens vào model User của bạn.
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Passport\HasApiTokens; // Import trait
class User extends Authenticatable
{
use HasApiTokens, Notifiable; // Thêm trait
}
Bước 5: Cấu Hình Auth Guards
Trong config/auth.php, đặt driver api thành passport.
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport', // Đổi từ 'token' thành 'passport'
'provider' => 'users',
],
],
Các Loại Token
1. Personal Access Tokens
Tuyệt vời cho việc testing hoặc để người dùng tự tạo token cho mình (như GitHub PATs).
Cấu hình:
Trong App\Providers\AppServiceProvider (hoặc AuthServiceProvider ở các phiên bản cũ):
use Laravel\Passport\Passport;
public function boot()
{
// ...
}
Tạo Token:
$user = User::find(1);
$token = $user->createToken('Development Token')->accessToken;
2. Password Grant Tokens
Hữu ích cho các client first-party (như mobile app của riêng bạn) nơi người dùng cung cấp username và password.
Yêu cầu Token:
Client gửi POST request tới /oauth/token:
POST /oauth/token
{
"grant_type": "password",
"client_id": "client-id",
"client_secret": "client-secret",
"username": "user@example.com",
"password": "user-password",
"scope": ""
}
3. Client Credentials Grant
Hữu ích cho giao tiếp machine-to-machine mà không có user tham gia.
Yêu cầu Token:
POST /oauth/token
{
"grant_type": "client_credentials",
"client_id": "client-id",
"client_secret": "client-secret",
"scope": ""
}
Bảo Vệ Routes
Sử dụng middleware auth:api để bảo vệ các API routes.
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});
Token Scopes
Scopes cho phép bạn giới hạn những gì một token có thể làm.
Định nghĩa Scopes:
Trong AppServiceProvider:
Passport::tokensCan([
'place-orders' => 'Place orders',
'check-status' => 'Check order status',
]);
Kiểm tra Scopes: Trong controller hoặc middleware:
if ($request->user()->tokenCan('place-orders')) {
// ...
}
Hoặc sử dụng middleware:
Route::get('/orders', function () {
// ...
})->middleware(['auth:api', 'scope:check-status']);
Thời Hạn Token
Bạn có thể tùy chỉnh thời hạn token trong AppServiceProvider:
public function boot()
{
Passport::tokensExpireIn(now()->addDays(15));
Passport::refreshTokensExpireIn(now()->addDays(30));
Passport::personalAccessTokensExpireIn(now()->addMonths(6));
}
Thực Hành Tốt Nhất
- Giữ Bí Mật Các Secrets: Không bao giờ để lộ
client_secrettrong code frontend (JS/HTML). - Sử Dụng HTTPS: Luôn sử dụng HTTPS trong production để bảo vệ tokens khi truyền tải.
- Thời Hạn Ngắn: Sử dụng thời gian hết hạn ngắn hơn cho access tokens và dùng refresh tokens để lấy tokens mới.
- Dọn Dẹp Tokens: Thường xuyên xóa các tokens đã bị thu hồi và hết hạn khỏi database:
php artisan passport:purge
Passport rất mạnh mẽ. Với các trường hợp đơn giản hơn, hãy nhớ xem xét Sanctum. Nhưng để hỗ trợ OAuth2 đầy đủ, Passport là lựa chọn đúng đắn.