gba-3のメモ

てきとー

laravel passportでユーザー情報を取得(laravel6)

はじめに

laravelを学習し始めたのでlaravel passportを利用してユーザー情報の取得を行った
ログイン機能の作成部分まではlaravelのドキュメントを流用しているのでそちらをみるとより正確な情報を得ることができるので、ぜひそちらを見てください

環境

  • 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"}

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

参考文献