PHP
laravel

Laravel開発:API認証のPassportを使ってみる

こちらの内容はブログにも投稿しています。

Laravelについてはこちらにまとめていこうと思います。

https://it-kunip.site/tag/laravel/

はじめに


APIの開発で認証をどのようにしようかと悩んだ時にLaravelでPassportというのがあるらしいので、少し調べながらまとめて行きたいと思います。

https://readouble.com/laravel/5.7/ja/passport.html

環境:


OS : macOS High Sierra 10.13.6

MAMP : 5.1

Laravel : 5.7.6

Laraveのプロジェクトを作成する


詳細な内容は「Laravel開発:1.環境構築をMAMPを使用して作成する」に記載しているので、こちら参考にして下さい。

・sampleという名でプロジェクトを作成します。

$ composer create-project laravel/laravel --prefer-dist sample

・VirtualHostの設定

MAMPを利用している場合は MAMP/con/apache/extra/httpd-vhosts.conf を編集します。

・DBの設定

phpMyAdminから今回のプロジェクト用に「sample」という名でdatabaseを作成します。

・.envの設定

以下の値を変更して下さい。

APP_URL=http://localhost:8888
DB_PORT=8889
DB_DATABASE=sample
DB_USERNAME=root
DB_PASSWORD=root

この時点で http://localhost:8888/ を表示するとLaravelの画面が表示されます。

Pasportをセットアップする


ここからは公式ドキュメントに沿って進めていきます。

インストール


まずは、Passportをインストールします。
composer require laravel/passport

インストールが終わるとPassportのマイグレーションファイルがが作成されているので、マイグレーションを実行してテーブルを作成します。
php artisan migrate

次にアクセストークンの生成に必要な暗号キーを作成します。次のコマンドで「パーソナルアクセス」と「パスワードグラント」のクライアントが生成されるようです。
php artisan passport:install

実行すると以下のような結果が表示されます。
$ php artisan passport:install
Encryption keys generated successfully.
Personal access client created successfully.
Client ID: 1
Client Secret: Z59H8xw3RCrRRcUnyxy6TccAKrsNgrceEwpqcGmN
Password grant client created successfully.
Client ID: 2
Client Secret: E2Ug4jn1pmBJVCRSkN3SSUaIB1nl5x8MGkNEfkso

クライアントが2つ作成されているので、Client Secretは保存して置きます。

App\UserモデルにHasApiTokensを追加します

<?php

namespace App;

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

class User extends Authenticatable
{
    use HasApiTokens, Notifiable; // HashApiTokensを追加

App\Providers\AuthServiceProvider.php に Passport:rootesメソッドの呼出しを追加します。

アクセストークンの発行、失効、クライアントとパーソナルアクセスの管理するrouteを登録するようです。

public function boot()
{
    $this->registerPolicies();

//
Passport::routes(); // bootメソッドに追加


}

最後に、config\auth.php の設定を変更してapiの認証をpassportに変更します。
'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

'api' => [
    'driver' => 'passport',   // 変更
    'provider' => 'users',
],


],

フロントエンド


ユーザがログインしてトークンを発行することを想定して、簡単に発行できるテンプレートが用意されているようです。

こちらはVueJSのコンポーネントで利用できるようです。

まずはコンポーネントを用意します。

php artisan vendor:publish --tag=passport-components

resources/js/components/passportに3つのファイルが作成されます。

こちらを/resources/js/app.jsに登録してVueJSから利用できるようにします。

// ↓↓↓↓追加
Vue.component(
    'passport-clients',
    require('./components/passport/Clients.vue')
);

Vue.component(
    'passport-authorized-clients',
    require('./components/passport/AuthorizedClients.vue')
);

Vue.component(
    'passport-personal-access-tokens',
    require('./components/passport/PersonalAccessTokens.vue')
);
// ↑↑↑↑追加
const app = new Vue({
    el: '#app'
});

次にnpm run devを実行します。
npm run dev

※ 自分の環境ではエラー(sh: cross-env: command not found)になりましたので、cross-envを追加します。追加後にキャッシュをクリアして再インストールします。
npm install --save-dev cross-env
rm -rf node/modules
rm package-lock.json
npm cache clear --force
npm install

再度、実行します。
npm run dev

ユーザ認証を追加してTokenの発行を試してみる


Laravelの認証機能を追加します。
php artisan make:auth

ログイン後のHome画面(resources/views/home.blade.php)で先程のコンポーネントを追加します。
@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">Dashboard</div>

            <div class="card-body">
                @if (session('status'))
                    <div class="alert alert-success" role="alert">
                        {{ session('status') }}
                    </div>
                @endif
                {{--↓↓↓↓ 追加--}}
                <passport-clients></passport-clients>
                <passport-authorized-clients></passport-authorized-clients>
                <passport-personal-access-tokens></passport-personal-access-tokens>
                {{--↑↑↑↑ 追加--}}
            </div>
        </div>
    </div>
</div>



@endsection

実際にユーザを登録してHome画面を表示するとトークンが発行できるようになっています。


次は、APIの実装部分に入っていきたいと思います。