laravel passport導入
laravel プロジェクト作成
$ composer create-project laravel/laravel .
passport install
$ composer require laravel/passport
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 |
+------+--------------------------------------------------------------+-------+
artisanコマンド
passport
passport:client アクセストークンを発行するクライアントを作成する。
passport:hash クライアントテーブル内の既存のシークレットをすべてハッシュ化します。
passport:install Passport を使用するための準備に必要なコマンドを実行します。
passport:keys API 認証用の暗号化キーを作成します。
passport:purge 失効および/または期限切れのトークンと認証コードをパージします。
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"]
passport:installを実行すると
oauth_clientsテーブルにclientがinsertされる
・UserモデルにLaravel\Passport\HasApiTokensトレイルを追加する。
・passportのrouteを追加
・config/auth.phpにpassport driverを追加。apiのguardで使えるようにする
$ php artisan passport:keys
アクセストークンを作成するのに必要な秘密鍵/公開鍵のファイルを作成する。
(passport:install時に内部で実行されているかも)
storage以下にファイルが作成される。.gitignoreでignoreされている。
ファイルロードするpathを変更できる
Passport::loadKeysFrom(__DIR__.'/../secrets/oauth');
keyは環境変数から読み込むことも可能。ファイルだと取り扱い面倒なので環境変数の方が良い気がする。
設定ファイルをリソース公開した後、環境変数として定義することにより、アプリケーションの暗号化キーをロードできます。
$ php artisan vendor:publish --tag=passport-config
を実行する必要がある・・・?実行しなくても環境変数さえ定義しておけば読み込んでくれそうだけど
要確認
$ php artisan passport:client
クライアント作成コマンド
モデルのオーバーライド
クライアントモデルを上書きしてアプリケーションに合わせてカスタマイズできる
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);
}
運営用にクライアントを管理するダッシュボードで使えるjson apiが用意されている。
ただのapiなのでフロントでリクエストしてviewと結合する必要あり。
リクエストの承認画面のカスタマイズができる
「OO権限を許可しますか?」の画面
$ php artisan vendor:publish --tag=passport-views
viewをpublishすることでカスタマイズできるようになる
承認をスキップすることも可能(ファーストパーティ制のクライアントで使用)
クライアントモデルを拡張し、skipsAuthorization()でtrueを返せば、承認済みとしてスキップされる
class Client extends BaseClient
{
/**
* クライアントが認可プロンプトを飛ばすべきか決める
*
* @return bool
*/
public function skipsAuthorization()
{
return $this->firstParty();
}
}
有効期限切れや無効なトークンは削除すること
purgeコマンドで削除できる。
# 無効・期限切れのトークンと認可コードを破棄する
php artisan passport:purge
# 無効なトークンと認可コードのみ破棄する
php artisan passport:purge --revoked
# 期限切れのトークンと認可コードのみ破棄する
php artisan passport:purge --expired
アクセストークンには有効期限がある。デフォルト1時間?
有効期限は指定できる。
作成済みのアクセストークンの有効期限は変更できない。
クライアント認証情報グラントトークン
マシン-マシン間の認証に最適。
専用middlewareをrouteにつければガードされる。スコープで制限することも可能
Route::get('/orders', function (Request $request) {
...
})->middleware('client');
Route::get('/orders', function (Request $request) {
...
})->middleware('client:check-status,your-scope');