Laravel Passportを使ったOauthサーバ
Oauth2.0の認可サーバを構築したいと思いLaravel Passportを使うと簡単に実現できそうだったので試してみました。
インストール
Composerでインストール
空のプロジェクトを用意します。
$ composer create-project --prefer-dist laravel/laravel:^9.0 oauth2 $ cd ./oauth2
ComposerでPassportをインストールします。
$ composer require laravel/passport
DBテーブルの作成
migrateコマンドを実行するとoauthに必要なテーブル群が作成されます。
$ php artisan migrate
↓こんな感じです。
mysql> show tables; +-------------------------------+ | Tables_in_idadb | +-------------------------------+ | failed_jobs | | migrations | | oauth_access_tokens | | oauth_auth_codes | | oauth_clients | | oauth_personal_access_clients | | oauth_refresh_tokens | | password_resets | | personal_access_tokens | | users | +-------------------------------+ 10 rows in set (0.00 sec)
暗号化キーの作成
アクセストークンを生成するために必要な暗号化キーを作成します。
クライアントからTokenを要求する際に使います。
php artisan passport:install Encryption keys generated successfully. Personal access client created successfully. Client ID: 1 Client secret: Ule2NlI8PK09IkWZzFOfqTkfgyGPw4I5GIL4Jzry Password grant client created successfully. Client ID: 2 Client secret: CkNUjfREWqCH9vgqOuXPPsF5R6KxOLI5n8sBNg9J
ソースコード書き換え
いくつかライブラリのソースコードを書き換えます。
デフォルトのSanctumからPassportに変更
app/Models/User.php
# use LaravelSanctumHasApiTokens; use LaravelPassportHasApiTokens;
APIでPassportを使用する設定を追記
config/auth.php
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'passport', 'provider' => 'users', ], ],
使ってみる
ユーザーの登録
認可するユーザーを登録します。
今回はLaravelのSeeder(データ初期値を設定する仕組み)を使います。
初期値設定用のファイルを作って反映します。
$ php artisan make:seeder UsersTableSeeder $ vi database/seeders/UsersTableSeeder.php $ php artisan db:seed --class=UsersTableSeeder
初期値設定のファイルの中身
class UsersTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { $param = [ 'name' => 'user1', 'email' => 'user1@example.com', 'password' => Hash::make('testtest') ]; DB::table('users') -> insert($param); } }
Tokenの取得
curlでTokenを取得してみます。
インストールの際に取得した暗号化キーとDBに登録したユーザーの情報を使います。
$ curl -X POST -H 'Content-Type: application/json' -d '{"grant_type":"password", "client_id":"2", "client_secret":"CkNUjfREWqCH9vgqOuXPPsF5R6KxOLI5n8sBNg9J", "username":"user1@example.com", "password":"testtest","scope":"*"}' http://localhost:8000/oauth/token
無事にTokenが取得できました。
{"token_type":"Bearer","expires_in":31536000,"access_token":"eyJ0eXAiOiJKV1QiLCJhbGci.....","refresh_token":"def50200840b38f2845229e83c9a4388d3856ed1......"}
このTokenを使ってリソースサーバーへアクセスしますがそれは後日。