Open18

laravel passport導入

syysyy

laravel プロジェクト作成

$ composer create-project laravel/laravel .

syysyy

passport install

$ composer require laravel/passport

syysyy

migrate実行

+------+--------------------------------------------------------------+-------+
| Ran? | Migration                                                    | Batch |
+------+--------------------------------------------------------------+-------+
| Yes  | 2014_10_12_000000_create_users_table                         | 1     |
| Yes  | 2014_10_12_100000_create_password_resets_table               | 1     |
| Yes  | 2016_06_01_000001_create_oauth_auth_codes_table              | 1     |
| Yes  | 2016_06_01_000002_create_oauth_access_tokens_table           | 1     |
| Yes  | 2016_06_01_000003_create_oauth_refresh_tokens_table          | 1     |
| Yes  | 2016_06_01_000004_create_oauth_clients_table                 | 1     |
| Yes  | 2016_06_01_000005_create_oauth_personal_access_clients_table | 1     |
| Yes  | 2019_08_19_000000_create_failed_jobs_table                   | 1     |
+------+--------------------------------------------------------------+-------+
syysyy

artisanコマンド

 passport
  passport:client アクセストークンを発行するクライアントを作成する。
  passport:hash クライアントテーブル内の既存のシークレットをすべてハッシュ化します。
  passport:install Passport を使用するための準備に必要なコマンドを実行します。
  passport:keys API 認証用の暗号化キーを作成します。
  passport:purge 失効および/または期限切れのトークンと認証コードをパージします。
syysyy

passportの初期設定を行う。

  • 暗号化キーを作成する。
  • 個人アクセスとパスワード許可クライアントを作成する。
  • uuidsオプションでclient IDをuuidにできる
$ php artisan passport:install --help
Description:
  Run the commands necessary to prepare Passport for use

Usage:
  passport:install [options]

Options:
      --uuids            Use UUIDs for all client IDs
      --force            Overwrite keys they already exist
      --length[=LENGTH]  The length of the private key [default: "4096"]
syysyy

passport:installを実行すると
oauth_clientsテーブルにclientがinsertされる

syysyy

・UserモデルにLaravel\Passport\HasApiTokensトレイルを追加する。
・passportのrouteを追加
・config/auth.phpにpassport driverを追加。apiのguardで使えるようにする

syysyy

$ php artisan passport:keys
アクセストークンを作成するのに必要な秘密鍵/公開鍵のファイルを作成する。
(passport:install時に内部で実行されているかも)
storage以下にファイルが作成される。.gitignoreでignoreされている。

ファイルロードするpathを変更できる

Passport::loadKeysFrom(__DIR__.'/../secrets/oauth');
syysyy

keyは環境変数から読み込むことも可能。ファイルだと取り扱い面倒なので環境変数の方が良い気がする。

設定ファイルをリソース公開した後、環境変数として定義することにより、アプリケーションの暗号化キーをロードできます。

$ php artisan vendor:publish --tag=passport-config
を実行する必要がある・・・?実行しなくても環境変数さえ定義しておけば読み込んでくれそうだけど
要確認

syysyy

$ php artisan passport:client
クライアント作成コマンド

syysyy

モデルのオーバーライド

クライアントモデルを上書きしてアプリケーションに合わせてカスタマイズできる

use Laravel\Passport\Client as PassportClient;

class Client extends PassportClient
{
    // ...
}
public function boot()
{
    $this->registerPolicies();

    Passport::routes();

    Passport::useTokenModel(Token::class);
    Passport::useClientModel(Client::class);
    Passport::useAuthCodeModel(AuthCode::class);
    Passport::usePersonalAccessClientModel(PersonalAccessClient::class);
}
syysyy

運営用にクライアントを管理するダッシュボードで使えるjson apiが用意されている。
ただのapiなのでフロントでリクエストしてviewと結合する必要あり。

syysyy

リクエストの承認画面のカスタマイズができる
「OO権限を許可しますか?」の画面

$ php artisan vendor:publish --tag=passport-views

viewをpublishすることでカスタマイズできるようになる

syysyy

承認をスキップすることも可能(ファーストパーティ制のクライアントで使用)
クライアントモデルを拡張し、skipsAuthorization()でtrueを返せば、承認済みとしてスキップされる

class Client extends BaseClient
{
    /**
     * クライアントが認可プロンプトを飛ばすべきか決める
     *
     * @return bool
     */
    public function skipsAuthorization()
    {
        return $this->firstParty();
    }
}
syysyy

有効期限切れや無効なトークンは削除すること
purgeコマンドで削除できる。

# 無効・期限切れのトークンと認可コードを破棄する
php artisan passport:purge

# 無効なトークンと認可コードのみ破棄する
php artisan passport:purge --revoked

# 期限切れのトークンと認可コードのみ破棄する
php artisan passport:purge --expired
syysyy

アクセストークンには有効期限がある。デフォルト1時間?
有効期限は指定できる。
作成済みのアクセストークンの有効期限は変更できない。

syysyy

クライアント認証情報グラントトークン
マシン-マシン間の認証に最適。

専用middlewareをrouteにつければガードされる。スコープで制限することも可能

Route::get('/orders', function (Request $request) {
    ...
})->middleware('client');

Route::get('/orders', function (Request $request) {
    ...
})->middleware('client:check-status,your-scope');