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

<h2>動作環境</h2>
php:7.2.5
laravel: 7.0
laravel/passport: 9.3
postgreSQL: 12.2

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

<h2>環境構築</h2>
<h3>laravelプロジェクトを作成</h3>
どこでもいいのでプロジェクト作りたいディレクトリで下記コマンド実行

```
$ laravel new laravel_passport
```
※laravel_passortはプロジェクト名

<h3>config/database.phpの設定変更</h3>

```

    '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', 'db'),
            'username' => env('DB_USERNAME', 'root'),
            'password' => env('DB_PASSWORD', 'password'),
            'charset' => 'utf8',
            'prefix' => '',
            'prefix_indexes' => true,
            'schema' => 'public',
            'sslmode' => 'prefer',
        ],
```
<h3> .envの変更</h3>
```
DB_CONNECTION= pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=DB名
DB_USERNAME=ユーザ名
DB_PASSWORD=パスワード
```
※DB名、ユーザ名は今回新たに作成する

<h3>app.phpの設定変更</h3>
```
'timezone' => 'Asia/Tokyo',
'locale' => 'ja',
```
<h3>DB作成</h3>
DB起動

```
postgres -D /usr/local/var/postgres
```
DB接続

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

DB作成

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

<h2>認証機能を追加</h2>
作成したプロジェクト内で操作。

```
$ composer require laravel/ui
$ php artisan ui vue --auth
```
以上のコマンドで、レイアウトビュー、登録ログインビューをインストールし、同時にすべての認証エンドポイントのルートも定義。

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

```
$ php artisan migrate
```

<h2>laravel passportをインストール</h2>
ようやく本題。こちらの記事が超参考になりました。
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 
```
<h3>Keyの発行</h3>
暗号化に利用するシード値などを生成します。

```
$ 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カラムの値)

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

```
php artisan tinker
$user1 = new App\User;
$user1->name = 'user1';
$user1->email = 'user1@test.com';
$user1->password = Hash::make('testtest');
$user1->save();
```
<h3>tokenを発行</h3>
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":"user1@test.com", "password":"testtest","scope":"*"}' http://localhost:8000/oauth/token
```
以上のながいコマンドを入力し、問題がなければtokenが発行されて返ってきます。

結果

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

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

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

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

結果

```
{"id":1,"name":"user1","email":"user1@test.com","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を使いユーザ情報を取得→返却してくれる、といった流れになります。

以上です。