Laravel 5.3 - Passport (Part 1)

Chào các bạn, hôm nay mình sẽ hướng dẫn các bạn sử dụng Passport trong laravel 5.3 Đầu tiên chúng ta cài đặt package Passport vào trong project

composer require laravel/passport

Sau đó đăng ký service passport vào trong file config/app.php bằng cách thêm dòng này vào trong mảng providers:

Laravel\Passport\PassportServiceProvider::class,

Service passport cung cấp cho chúng ta các table cần thiết, bằng lệnh php artisan migrate các table sẽ được tạo ra. Bạn có thể xem thông tin các table ở thư mục /vendor/laravel/passport/database/migrations Các table được tạo ra gồm:

  • oauth_clients: Chứa các client được đăng ký trên server
  • oauth_access_tokens: Chứa access token của user và client
  • oauth_refresh_tokens: Chứa refresh token của access token để sinh ra token mới khi mà access token hết hạn
  • oauth_personal_access_clients và oauth_auth_codes: Dùng cho grant Client Credentials của Oauth2. Nếu các bạn chưa biết Oauth2 là gì thì hãy xem bài viết này: https://viblo.asia/tungshooter/posts/3OEqGjDpR9bL#grant-type-client-credentials-12 Tiếp theo bạn run câu lệnh này trên terminal:
php artisan passport:install

Câu lệnh này dùng để tạo ra 2 client: 1 client dùng cho grant password và 1 client dùng cho personal access. Các client này là của server passport dùng để tạo ra access token khi các ứng dụng truy cập vào server. Sau khi chạy câu lệnh này, thì table oauth_clients sẽ sinh ra 2 record như sau:

id user_id name secret redirect personal_access_client password_client revoked created_at updated_at
1 NULL My Application Personal Access Client dn4lcA9pLib8DufNn3wdUYYA56p0TzRLbZjSLetQ http://localhost 1 0 0 2017-02-03 03:03:45 2017-02-03 03:03:45
2 NULL My Application Password Grant Client K9ItVkrCEkfYikwh0OO3poXjXTsKJjrigXfWb0zg http://localhost 0 1 0 2017-02-03 03:03:45 2017-02-03 03:03:45

Ở đây tương tự như tạo ứng dụng của facebook vậy, khi bạn tạo xong thì facebook sẽ trả về CLIENT_ID và CLIENT_SECRET, tương tự như ở đây CLIENT_ID=1 và CLIENT_SECRET = dn4lcA9pLib8DufNn3wdUYYA56p0TzRLbZjSLetQ. Trường redirect là đường dẫn callback khi truy cập ứng dụng thành công. Trường revoked là để xem thử app(ứng dụng) này đã được thu hồi bởi admin(admin của passport) hay chưa. Ở đây có 2 trường là personal_access_client và password_client để xác định grant của ứng dụng, password_client = 1 là grant password, personal_access_client = 1 là grant Client Credentials.

Xong rồi, bắt đầu config trong code nhé. Đầu tiên chúng ta add trait: Laravel\Passport\HasApiTokens vào model User của bạn và sau đó use HasApiTokens trong model User nhé. /app/User.php

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Laravel\Passport\HasApiTokens;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable, HasApiTokens;
}

Bạn có thể xem trait này ở đường dẫn vendor/laravel/passport/src/HasApiTokens.php . Trait này giúp bạn thao tác với access token của user, nó có các method

  • clients(): Lấy tất cả các client(ứng dụng) được đăng ký bởi user, giống như facebook bạn có thể đăng ký nhiều ứng dụng, và function này sẽ lấy ra tất cả các ứng dụng đã được đăng ký, ở bảng trên chúng ta có user_id = NULL là do khi chạy lệnh php artisan passport:install nó sẽ gọi function createPersonalClient và createPasswordClient của file vendor/laravel/passport/src/Console/ClientCommand.php, sau đó truyền vào user_id = NULL.
$client = $clients->createPersonalAccessClient(
            null, $name, 'http://localhost'
        );
        
File: /vendor/laravel/passport/src/ClientRepository.php

    /**
     * Store a new client.
     *
     * @param  int  $userId
     * @param  string  $name
     * @param  string  $redirect
     * @param  bool  $personalAccess
     * @param  bool  $password
     * @return Client
     */
    public function create($userId, $name, $redirect, $personalAccess = false, $password = false)
    {
        $client = (new Client)->forceFill([
            'user_id' => $userId,
            'name' => $name,
            'secret' => str_random(40),
            'redirect' => $redirect,
            'personal_access_client' => $personalAccess,
            'password_client' => $password,
            'revoked' => false,
        ]);

        $client->save();

        return $client;
    }

    /**
     * Store a new personal access token client.
     *
     * @param  int  $userId
     * @param  string  $name
     * @param  string  $redirect
     * @return Client
     */
    public function createPersonalAccessClient($userId, $name, $redirect)
    {
        return $this->create($userId, $name, $redirect, true);
    }
  • tokens(): Lấy access token của user.
  • token(): Lấy token hiện tại của user tương ứng với client
  • tokenCan($scope): Kiểm tra thử token đó có thuộc scope đó hay không
  • createToken(): tạo ra token ứng với grant Client Credentials
  • withAccessToken($accessToken): gán access token cho user.

Tiếp theo chúng ta thêm các route của passport vào project bằng cách thêm Passport::routes vào method boot của AuthServiceProvider.php. Sau khi thêm bạn vào terminal gõ: php artisan route:list sẽ thấy các route được cung cấp bởi passport như sau

+--------+----------+-----------------------------------------+------+----------------------------------------------------------------------------+--------------+
| Domain | Method   | URI                                     | Name | Action                                                                     | Middleware   |
+--------+----------+-----------------------------------------+------+----------------------------------------------------------------------------+--------------+
|        | GET|HEAD | /                                       |      | Closure                                                                    | web          |
|        | GET|HEAD | api/user                                |      | Closure                                                                    | api,auth:api |
|        | POST     | oauth/authorize                         |      | \Laravel\Passport\Http\Controllers\[email protected]  | web,auth     |
|        | GET|HEAD | oauth/authorize                         |      | \Laravel\Passport\Http\Controllers\[email protected]       | web,auth     |
|        | DELETE   | oauth/authorize                         |      | \Laravel\Passport\Http\Controllers\[email protected]        | web,auth     |
|        | GET|HEAD | oauth/clients                           |      | \Laravel\Passport\Http\Controllers\[email protected]                | web,auth     |
|        | POST     | oauth/clients                           |      | \Laravel\Passport\Http\Controllers\[email protected]                  | web,auth     |
|        | PUT      | oauth/clients/{client_id}               |      | \Laravel\Passport\Http\Controllers\[email protected]                 | web,auth     |
|        | DELETE   | oauth/clients/{client_id}               |      | \Laravel\Passport\Http\Controllers\[email protected]                | web,auth     |
|        | GET|HEAD | oauth/personal-access-tokens            |      | \Laravel\Passport\Http\Controllers\[email protected]   | web,auth     |
|        | POST     | oauth/personal-access-tokens            |      | \Laravel\Passport\Http\Controllers\[email protected]     | web,auth     |
|        | DELETE   | oauth/personal-access-tokens/{token_id} |      | \Laravel\Passport\Http\Controllers\[email protected]   | web,auth     |
|        | GET|HEAD | oauth/scopes                            |      | \Laravel\Passport\Http\Controllers\[email protected]                     | web,auth     |
|        | POST     | oauth/token                             |      | \Laravel\Passport\Http\Controllers\[email protected]        | throttle     |
|        | POST     | oauth/token/refresh                     |      | \Laravel\Passport\Http\Controllers\[email protected]        | web,auth     |
|        | GET|HEAD | oauth/tokens                            |      | \Laravel\Passport\Http\Controllers\[email protected] | web,auth     |
|        | DELETE   | oauth/tokens/{token_id}                 |      | \Laravel\Passport\Http\Controllers\[email protected] | web,auth     |
+--------+----------+-----------------------------------------+------+----------------------------------------------------------------------------+--------------+

Sau đó bạn vào file config/auth.php đặt lại driver của api là passport.

   'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'passport',
            'provider' => 'users',
        ],
    ],

Kết thúc phần 1 của Laravel - passport, qua phần 2 mình sẽ hướng dẫn các bạn code để tạo access token và trả về Api (dạng Json) như thế nào. Tài liệu tham khảo: https://laravel.com/docs/5.3/passport