Laravel 5.3 - Passport (Part 2)

Hôm nay mình tiếp tục hướng dẫn các bạn tạo 1 server passport để quản lý các app đăng ký. Sẽ giống như facebook, khi các bạn vào trang https://developers.facebook.com/ và tạo 1 app để phục vụ cho project thì nó sẽ trả về cho bạn ClientID và SecretID. Vậy ở đâu mà nó trả về những thông tin như vậy? Đó là vì Fb có một server quản lý các ứng dụng đã được đăng ký. Hôm nay mình sẽ demo 1 server như vậy. Khi bạn install passport thì nó đã hỗ trợ sẵn cho các bạn giao diện của server rồi. Bạn chỉ cần run command trên terminal là sẽ tạo ra các file giao diện cho Passport

php artisan vendor:publish --tag=passport-components

Server của passport đang viết bằng Vue.js. Nếu bạn chưa tìm hiểu qua Vue.js thì có thể tham khảo ở đây: https://vuejs.org/ Sau khi run command trên thì nó sẽ sinh ra 3 file ở thư mục resources/assets/js/components. Các file này mục đích là để định nghĩa các thẻ của giao diện, bạn cần đăng ký chúng vào file ** resources/assets/js/app.js** để tạo ra giao diện

Vue.component(
    'passport-clients',
    require('./components/passport/Clients.vue')
);

Vue.component(
    'passport-authorized-clients',
    require('./components/passport/AuthorizedClients.vue')
);

Vue.component(
    'passport-personal-access-tokens',
    require('./components/passport/PersonalAccessTokens.vue')
);

Sau khi đăng ký xong bạn run command sau: gulp --production (hoặc sudo gulp --production). Trước khi run command này bạn hãy install gulp(https://laravel.com/docs/5.3/elixir#installation), gulp-sass (https://www.npmjs.com/package/gulp-sass), gulp-webpack (https://www.npmjs.com/package/gulp-webpack). Mục đích của command này là để đưa các code js, css vào trong thư mục public, sau khi chạy command này bạn sẽ xem trong file public/js/app.js sẽ có code của 3 file lúc nãy.

Sau đó bạn thêm 3 dòng này vào file blade nào đó (có thể là tạo một file mới hoặc ghi trong file home.blade.php)

<passport-clients></passport-clients>
<passport-authorized-clients></passport-authorized-clients>
<passport-personal-access-tokens></passport-personal-access-tokens>

Các thẻ này nó sẽ lấy ở trong file app.js, sau đó ở app.js sẽ import các file vue.js dùng để định nghĩa các thẻ này. Như vậy bạn không thấy code html ở đâu mà nó lại tạo ra giao diện server passport. Code giao diện nó nằm ở trong thư mục này nhé resources/assets/js/components

Tiếp theo mình sẽ config cho access_token của passport Một access_token của passport sinh ra mặc định sẽ tồn tại mãi mãi mà không cần đến refresh token. Nếu bạn muốn config thời gian sống của access_token thì bạn thêm đoạn code này vào method boot của AuthServiceProvider.

public function boot()
{
    $this->registerPolicies();

    Passport::routes();

    Passport::tokensExpireIn(Carbon::now()->addDays(15));

    Passport::refreshTokensExpireIn(Carbon::now()->addDays(30));
}

Như trên thì sau 15 ngày thì access_token sẽ hết hạn và mình sẽ không dùng được token này nữa, thay vào đó passport sẽ sinh ra một access_token mới dựa vào refresh_token của access_token lúc nãy và set lại thời gian sống cho nó. Đây là đoạn code set thời gian tồn tại của access_token

/**
   * Get or set when access tokens expire.
   *
   * @param  \DateTimeInterface|null  $date
   * @return \DateInterval|static
   */
  public static function tokensExpireIn(DateTimeInterface $date = null)
  {
      if (is_null($date)) {
          return static::$tokensExpireAt
                          ? Carbon::now()->diff(static::$tokensExpireAt)
                          : new DateInterval('P1Y');
      } else {
          static::$tokensExpireAt = $date;
      }

      return new static;
  }

  /**
   * Get or set when refresh tokens expire.
   *
   * @param  \DateTimeInterface|null  $date
   * @return \DateInterval|static
   */
  public static function refreshTokensExpireIn(DateTimeInterface $date = null)
  {
      if (is_null($date)) {
          return static::$refreshTokensExpireAt
                          ? Carbon::now()->diff(static::$refreshTokensExpireAt)
                          : new DateInterval('P1Y');
      } else {
          static::$refreshTokensExpireAt = $date;
      }

      return new static;
  }