Laravel 5.4
laravelcollective 5.4
を使用します。
基本のユーザー認証機能を作成
make:auth
で基本となるユーザー認証関連のファイルを作成します。
$ php artisan make:auth
デフォルトである、ユーザーテーブルのマイグレーションファイルにapi_token
カラムを追記します。
database/migrations/xxxx_xx_xx_000000_create_users_table.php
Schema::create('users', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('email')->unique(); $table->string('password'); $table->string('api_token', 60)->unique()->nullable(); $table->rememberToken(); $table->timestamps(); });
マイグレーションコマンドでDBテーブルを作成します。
$ php artisan migrate
ログイン&ログアウト時に処理を追加
ログイン時にapi_token
カラムにランダムな文字列を保存してみます。
app/Http/Controllers/Auth/LoginController.php
protected function authenticated(Request $request, $user) { $user->update(['api_token' => str_random(60)]); } public function logout(Request $request) { // api_tokenをnullにする $user = $request->user(); $user->update(['api_token' => null]); $this->guard()->logout(); $request->session()->flush(); $request->session()->regenerate(); return redirect('/'); }
config/auth.php
のapi
のdriver
がtoken
になっていることを確認。
デフォルトのままなので特に変更の必要はないかと思います。
config/auth.php
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'token', 'provider' => 'users', ], ],
ビュー&JSの設定
レイアウトビューのapp.js
読み込み前にapiToke
として変数作成して、ログインしているユーザーのapi_token
を入れます。
resources/views/layouts/app.blade.php
<script> window.Laravel = {!! json_encode([ 'apiToken' => \Auth::user()->api_token ?? null ]) !!}; </script> <script src="{{ asset('js/app.js') }}"></script>
LaravelのVue.jsのデフォルトのHTTPクライアントはaxiosになっているので、axiosのheaderに先ほどのトークンを付与するようなことをします。
resources/assets/js/bootstrap.js
window.axios.defaults.headers.common['Authorization'] = 'Bearer ' + Laravel.apiToken;
試しに使ってみる
これで準備が整いました、簡単なサンプルで試してみます。
ルーテイングはroutes/api.php
にミドルウェアにはauth:api
を指定します。
例えばPostモデルがあったとすれば下記のようにします。
routes/api.php
Route::group(['middleware' => 'auth:api', 'namespace' => 'Api'], function() { Route::get('posts', function(){ return \App\Post::all(); }); });
表示するコンポーネントを作成。
resources/assets/js/components/PostList.vue
<template> <div class="posts"> <div v-if="message" class="alert alert-danger"> {{ message }} </div> <ul> <li v-for="post in posts"> {{ post.title }} </li> </ul> </div> </template> <script> export default { data() { return { posts: [] } }, mounted() { axios.get('/api/posts') .then(res => { this.posts = res.data; }) .catch(error => { this.message = 'データの取得に失敗しました。'; }); } } </script>
app.jsにコンポーネント登録
resources/assets/js/app.js
Vue.component('post-list', require('./components/PostsList.vue'));
あとは表示させたいビューに作成したコンポーネントを指定しましょう。
<post-list></post-list>
これで通常のセッションログインした時だけVueコンポーネントで表示できるようになります。
参考サイト
Laravel API Auth with Tokens