laravel7.xでlaravel/passportを導入した時の手順


動作環境

php:7.2.5
laravel: 7.0
laravel/passport: 9.3
postgreSQL: 12.2

※事前にcomposerをインストールする必要あり
※DBはお好みの物を使用

環境構築

laravelプロジェクトを作成

どこでもいいのでプロジェクト作りたいディレクトリで下記コマンド実行

$ laravel new laravel_passport

※laravel_passortはプロジェクト名

config/database.phpの設定変更


    'default' => env('DB_CONNECTION', 'pgsql'),


        'pgsql' => [
            'driver' => 'pgsql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '5432'),
            'database' => env('DB_DATABASE', 'accounting_software'),
            'username' => env('DB_USERNAME', 'root'),
            'password' => env('DB_PASSWORD', 'rod2yuya'),
            'charset' => 'utf8',
            'prefix' => '',
            'prefix_indexes' => true,
            'schema' => 'public',
            'sslmode' => 'prefer',
        ],

.envの変更

DB_CONNECTION= pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=DB名
DB_USERNAME=ユーザ名
DB_PASSWORD=パスワード

※DB名、ユーザ名は今回新たに作成する

app.phpの設定変更

'timezone' => 'Asia/Tokyo',
'locale' => 'ja',

DB作成

DB起動

postgres -D /usr/local/var/postgres

DB接続

psql -h localhost -p 5432 -U ユーザ名 -d postgres

DB作成

create database データベース名 owner ユーザ名;

認証機能を追加

作成したプロジェクト内で操作。

$ composer require laravel/ui
$ php artisan ui vue --auth

以上のコマンドで、レイアウトビュー、登録ログインビューをインストールし、同時にすべての認証エンドポイントのルートも定義。

マイグレーションでテーブル作成

$ php artisan migrate

laravel passportをインストール

ようやく本題。こちらの記事が超参考になりました。
https://qiita.com/zaburo/items/65de44194a2e67b59061

$ composer require laravel/passport

laravel/passortをインストールすると、新たにマイグレーションファイルがインストールされているので、マイグレーションでテーブルを生成する

$ php artisan migrate

DBに下記のテーブルが追加される。

 public | oauth_access_tokens                  | table    | root
 public | oauth_auth_codes                     | table    | root
 public | oauth_clients                        | table    | root
 public | oauth_clients_id_seq                 | sequence | root
 public | oauth_personal_access_clients        | table    | root
 public | oauth_personal_access_clients_id_seq | sequence | root
 public | oauth_refresh_tokens 

Keyの発行

暗号化に利用するシード値などを生成します。

$ php artisan passport:keys

キーが3つ生成されます。生成されたキーはDBのoauth_clientsテーブルに格納されます。

DBに接続し、下記コマンドで確認可能です。

select * from oauth_clients;

laravel passportは物凄く簡単に説明すると、oauth2.0の仕組みを利用しており、アクセスtokenを発行して、アクセスしているユーザが真のユーザであるかを判定する仕組みだと、私は理解しています。

そして、アクセスtokenを発行する際の認証方法として、いくつかのパターンが用意されており、その認証方法により、先ほど作成したkeyのうち、どのkeyを利用するか決まってきます。

今回私は、ID・パスワード方式によりtokenを発行する方法をとるので、使用するkeyは1番最初に発行されたkeyを使います。

(nameというカラムにpasswordと入っているレコードのsecretカラムの値)

テストユーザの作成

これまでの手順ですでにブラウザ上でユーザ登録ができるようになっていますが、面倒なのでコマンドラインで作成。
※ブラウザ上で作成したい場合は、php artisan serveでサーバを立ち上げ、指定されたURLにアクセス

php artisan tinker
$user1 = new App\User;
$user1->name = 'user1';
$user1->email = '[email protected]';
$user1->password = Hash::make('testtest');
$user1->save();

tokenを発行

tokenを発行する際は、oauth/tokenへAPIを叩く必要があります。Postmanなどを使ってもいいですが、あくまで動作確認なので、こちらもコマンドライン上で実行。

まず、laravelのサーバを立ち上げます。

$ php artisan serve

ターミナルからAPIを直接叩きます。

$ curl -X POST -H 'Content-Type: application/json' -d '{"grant_type":"password", "client_id":"1", "client_secret":"発行されたkey(secretカラムの値)", "username":"[email protected]", "password":"testtest","scope":"*"}' http://localhost:8000/oauth/token

以上のながいコマンドを入力し、問題がなければtokenが発行されて返ってきます。

結果

{"token_type":"Bearer","expires_in":31536000,"access_token":"発行されたtoken","refresh_token":"リフレッシュ用のtoken"}

ここで取得できたaccess_tokenを使うことで、ユーザ認証することが可能となります。

取得したtokenを使い、ユーザ情報を取得してみる

curl -H 'Accept: application/json' -H 'Authorization: Bearer 取得したaccess_token' http://localhost:8000/api/user

結果

{"id":1,"name":"user1","email":"[email protected]","email_verified_at":null,"created_at":"2020-07-07T03:29:40.000000Z","updated_at":"2020-07-07T03:29:40.000000Z"}

DBには「oauth_access_tokensaccess_token」にtokenとuser_idが対応付けられて保存されています。
access_tokenを使い、apiのapi/userを叩くことで、サーバ側でtokenによりuser_idを判定しuser_idを使いユーザ情報を取得→返却してくれる、といった流れになります。

以上です。