Laravel6でユーザー情報を取得する(Laravel Passport)

# はじめに
laravelを学習し始めたのでlaravel passportを利用してユーザー情報の取得を行った  
ログイン機能の作成部分までは[laravelのドキュメント](https://readouble.com/laravel/6.x/ja/passport.html)を流用しているのでそちらをみるとより正確な情報を得ることができるので、ぜひそちらを見てください

## 環境
- laravel 6.5.1
- mysql 5.7

## 手順

laravel passportのパッケージをインストール

```
$ composer require laravel/passport
```
クライアントとアクセストークンを保存しておくためのテーブルを作成

```
$ php artisan migrate
```

`App\User`モデルに`Laravel\Passport\HasApiTokens`トレイトを追加する

```
<?php

namespace App;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Passport\HasApiTokens; // 追加

class User extends Authenticatable
{
    use HasApiTokens, Notifiable; // HasApiTokensを追加
}
```
`AuthServiceProvider.php`内でアクセストークンの発行、失効のために`Passport::routes`メソッドを呼び出す

```
<?php

namespace App\Providers;

use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;
use Laravel\Passport\Passport; // 追加

class AuthServiceProvider extends ServiceProvider
{
    /**
     * アプリケーションのポリシーのマップ
     *
     * @var array
     */
    protected $policies = [
        'App\Model' => 'App\Policies\ModelPolicy', // 最初はコメントされているのでコメントを削除する
    ];

    /**
     * 全認証／認可サービスの登録
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        Passport::routes(); // 追加
    }
}
```
`config/auth.php`内のガードの`api`認証の`driver`オプションを`token`から`passport`に変更する

```
'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'passport', // token => passport
        'provider' => 'users',
    ],
],
```
アクセストークンを生成するために必要な暗号キーの作成

```
$ php artisan passport:install
```
コントローラーの作成

```
$ php artisan make:controller Api/AuthController
```
Api/AuthControllerにloginメソッドを作成

```
<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\JsonResponse;


class AuthController extends Controller
{
    public function login(Request $request): JsonResponse
    {
        $credentials = $request->only('email', 'password');

        if (Auth::attempt($credentials)) {
            $user = Auth::user();
            $token = $user->createToken('Laravel Password Grant Client')->accessToken;
            return new JsonResponse(['token' => $token], 200);
        }

        return new JsonResponse([
            'message' => 'Unauthenticated.'
        ], 401);
    }
}

```
routes/api.phpにログイン用のルートを追加

```
Route::post('/login', 'Api\AuthController@login');
```

ユーザーの作成

```
$ php artisan tinker
$ $user = new App\User;
$ $user->name = 'testuser';
$ $user->email = 'test@email.com';
$ $user->password = Hash::make('testtest');
$ $user->save();
```

Tokenをリクエストする

```
$ curl -X POST http://localhost:8000/api/login -d email=test@email.com -d password=testtest
```

レスポンス

```
{"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI2IiwianRpIjoiZmU1YWE4OGY1MTRkYzdmZDUyOTlkYzMyZDE3NmIwNGM0YWE0MDRhNWZkMzBkYmFmYjJhYzExMDhiYWNkNDJiOTc0ZDY4OTQ1MWU5MTcwYWMiLCJpYXQiOjE1NzQwOTI4MjMsIm5iZiI6MTU3NDA5MjgyMywiZXhwIjoxNjA1NzE1MjIzLCJzdWIiOiIxIiwic2NvcGVzIjpbXX0.B6FoP_dLWwCN9S17WxMUplPKVZyLwaW7zIRzVJJm-sFlCQ65JOxtGYgsVWeAHmadnmwOJ3yL3Yz1mHHpBFk9ZFD3mGy23UQIqGM71JUyrvjrAlDLmiyqNGz1PUM-7_ta3FM4-KDn7OWCiUnYHZMWJtylP9wvQ8b3ArglC4DeaQxgGvCQS7_vavB1_o0I7kEkqRjHuXl0-7I_w9E2FQXJHrw7tFPdznAy6rkeOYMLKdDEvAOdSlNXCwwhiARPFWiTk7NaBAlfa0Wjf8MeJSFIlUf9AiJo7lLu8r28A4Miik7J_Y9dRxipUcdCjiz7gPjPqFXeeqhH1NQk_qC-6Fy2u2xzx6pAU-Lu1vp32TANn9ZQ5Vn0xFxJJBTJ0FoOzqcQ44fb5T93K9sCIc_1L_X75K3g5KsY96N4h_bZr84e_VUvB_WHQ0iq8VJO2F-Lj1tsSJiUOUwepB1d2eIWbFzWTc1Ur56crUoBr27GoilhFT-8qp5Md2qoOeottu5qO1v5ybOj9DGZIKeZVN_z4L4awb-IuseMGQQCbfquMNmBaLAmgFTlhA3usoiArp9sX4WC1uphf9u9bhAr5tCiqdeVI5K-lLo_qESfP_Zney2IZtmLNCrNpjwxk7BJA7Sl4oI0clUYg-NJnrhRIRW7DHg1Z7eHZsaItDORCkr78HMlHr4"}
```

Tokenからユーザー情報を取得

```
$ curl -X GET http://localhost:8000/api/user -H 'Content-Type: application/json' -H 'Authorization: Bearer 取得したToken'
```

レスポンス

```
{"id":1,"name":"test","email":"test@email.com","email_verified_at":null,"created_at":"2019-11-18 10:56:18","updated_at":"2019-11-18 10:56:18"}
```

以上でユーザー情報の取得をできるようになりました。

## 参考文献
- https://blog.capilano-fw.com/?p=3745
- https://readouble.com/laravel/6.x/ja/passport.html