Hướng Dẫn Laravel Passport

· 5 min read

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

  1. Giữ Bí Mật Các Secrets: Không bao giờ để lộ client_secret trong code frontend (JS/HTML).
  2. Sử Dụng HTTPS: Luôn sử dụng HTTPS trong production để bảo vệ tokens khi truyền tải.
  3. 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.
  4. 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.

Bình luận