のぐそんブログ

暗いおじさんがシコシコ書くブログです。

Laravelでのjwt-auth利用する為のメモ。

Laravelでのjwt-auth利用する為の自分用のメモです。

Laravelの認証機能を利用してテーブルを作成

$ php artisan make:auth
$ php artisan migrate

jwt-authをインストール

composer require tymon/jwt-auth

configファイル生成

php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"

config/jwt.phpが作成される。

secretの生成

php artisan jwt:secret

.envファイルにJWT_SECRETが追加されているのを確認する。

app/User.php

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Tymon\JWTAuth\Contracts\JWTSubject;

class User extends Authenticatable implements JWTSubject
{
    use Notifiable;

    protected $fillable = [
        'name', 'email', 'password',
    ];

    protected $hidden = [
        'password', 'remember_token',
    ];

    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

    public function getJWTCustomClaims()
    {
        return [];
    }
}

config/auth.php

<?php

return [
    'defaults' => [
        'guard' => 'api',
        'passwords' => 'users',
    ],

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

        'api' => [
            'driver' => 'jwt',
            'provider' => 'users',
        ],
    ],

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],

    'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
        ],
    ],

];

app/Http/Controllers/Api/AuthController.php

<?php
namespace App\Http\Controllers;

class AuthController extends Controller
{
    function login() {
        $credentials = request(['email', 'password']);

        if (!$token = auth('api')->attempt($credentials)) {
            return response()->json(['error' => 'Unauthorized'], 401);
        }

        return $this->respondWithToken($token);
    }

    public function logout()
    {
        auth()->logout();
        return response()->json(['message' => 'ログアウトしました。']);
    }

    public function me()
    {
        return response()->json(auth()->user());
    }

    protected function respondWithToken($token)
    {
        return response()->json([
            'access_token' => $token,
            'token_type' => 'bearer',
            'expires_in' => auth("api")->factory()->getTTL()
        ]);
    }
}

トークンの有効期限は60分に設定されている。 変更するにはconfig/jwt.phpを変更する。

routes/api.php

<?php

use Illuminate\Http\Request;

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

// ユーザー情報と、ログアウトは認証あり
Route::group(['middleware' => 'auth:api'], function () {
    Route::get('/me', 'Api\AuthController@me');
    Route::post('/logout', 'Api\AuthController@logout');
});

疎通を確認

ユーザーデータを作成

以下を実行。

php artisan make:seeder UsersTableSeeder

以下を設定。

<?php

use Illuminate\Database\Seeder;

class UsersTableSeeder extends Seeder
{
    /#### 
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('users')->insert([
            [
                'email' => 'admin@example.com',
                'password' => bcrypt('password'),
                'remember_token' => null,
                'created_at' => '2018-10-02 14:28:19',
                'updated_at' => '2018-10-02 14:28:19'
            ]
        ]);
    }
}

実行。

php artisan db:seed

テーブルにユーザー情報が追加されているのを確認する。

ログインしてみる

curl http://localhost:8080/api/login -d email=admin@example.com -d password=password

以下が返却されればOK。

{"access_token":"eyJ0e...","token_type":"bearer","expires_in":3600}

アクセストークンを利用してユーザー情報を取得してみる

curl -H "Authorization: Bearer eyJ0e..." http://localhost:8080/api/me

以下が返却されればOK。

{"id":1,"email":"admin@example.com","email_verified_at":null,"created_at":"2018-10-02 14:28:19","updated_at":"2018-10-02 14:28:19"}

ユーザー登録をしてみる

app/Http/Controllers/Api/AuthController.php以下を追加。

    public function register(Request $request)
    {
        $user = new User;
        $user->fill($request->all());
        $user->password = bcrypt($request->password);
        $user->save();
        return $this->publishToken($request);
    }

    protected function publishToken($request)
    {
        $credentials = request(['email', 'password']);

        $token = auth('api')->attempt($credentials);
        return $this->respondWithToken($token);
    }

routes/api.phpに以下を追加

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

実行

curl http://localhost:8080/api/register -d email=sample@example.com -d password=password

以下が返却されればOK。

{"access_token":"eyJ0eXAi...","token_type":"bearer","expires_in":3600}