Laravelについてはこちらにまとめていこうと思います。
はじめに
APIの開発で認証をどのようにしようかと悩んだ時にLaravelでPassportというのがあるらしいので、少し調べながらまとめて行きたいと思います。
環境:
OS : macOS High Sierra 10.13.6MAMP : 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
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
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
@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