ハマログ

株式会社イーツー・インフォの社員ブログ

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を使ってリソースサーバーへアクセスしますがそれは後日。

LaravelLaravel PassportOAuthPassport

  at   2022年9月27日


関連記事

Laravel5のartisanコマンドの自作

Laravel5でArtisanコマンドを自作する方法について。 Laravel…

MacOS XのGatekeeper

こんにちは、かねこです。 今流行のSASS/LESSをShin先輩に調べてもらっ…

Laravelでutf8mb4対応

MySQLで絵文字を扱おうと、utf8からutf8mb4に変更して試す機会があり…


← 前の投稿

次の投稿 →