くずきのblog

技術とか色々

LaravelでJSON Web Tokenを使った認証方法

Laravel + Reactでサービスを構築した場合に、APIによる認証方法としてJSON Web Token(JWT)を使った例を紹介しようと思う。

JSON Web Tokenとは?

ネットわかりやすく書いてあったので引用させていただくと

JWT(ジョット)とは JSON Web Token の略で、電子署名付きの URL-safe(URLとして利用出来る文字だけ構成される)な JSONのことです。 電子署名により、JSON の改ざんをチェックできるようになっています。 ざっくり言うと、改ざんできない JSON ということになります。 引用:https://qiita.com/gctoyo/items/8d0ffb265845ab8cc87c#jwt-%E3%81%A8%E3%81%AF

というセキュアで便利なものである。

認証として利用する

認証として利用するためには、とても便利なライブラリがあるのでそちらを使う。

github.com

インストールに関しては、公式の方を参考にする。

Laravel Installation - jwt-auth

モデルの設定

設定自体もとても楽で、Laravelにすでにある認証方法の一部変更するだけでいい。
実際の設定しているconfig/auth.phpはこのようになる。

<?php

return [


    'defaults' => [
        'guard' => 'api',
    ],


    'guards' => [
        'api' => [
            'driver' => 'jwt', # ここをjwtにする
            'provider' => 'client',
        ],

    ],


    'providers' => [
        'client' => [
            'driver' => 'eloquent',
            'model' => App\Models\ClientAccount::class,
        ],
    ],

];

ログイン

ログイン時にはいくつかバリデーションを行い、レスポンスにはトークンを返している。

<?php
public function login(Request $request){
    config(['jwt.user' => Client::class]);

    $account = $this->clientAccount->getLoginUserByEmail($request->email);

    // Emailまたはstatusがマッチしない場合
    if(!$account){
        throw new AuthenticationException;
    }

    // passwordがマッチしない場合
    if (!Hash::check($request->password, $account->password))
    {
        throw new AuthenticationException;
    }
    
    // ログイン情報を保存するにチェックを入れた場合
    if($request->remember){
        if (! $token = Auth::guard('api')->setTTL(config('jwt.ttl_r'))->login($account)) {
            throw new AuthenticationException;
        }
    }else{
        if (! $token = Auth::guard('api')->login($account)) {
            throw new AuthenticationException;
        }
    }

    return compact('token');
}

ユーザー側からの利用

トークンの利用については、API利用時にAuthorizationヘッダーにBearer: {取得したtoken}を付与すればできる。以下の記事が参考になる。

qiita.com

感想

  • JWTを使った認証もライブラリのおかげで楽に実装
  • ただ、JWTに関しては色々言われてるので利用する場合はちゃんと勉強しとかないとなとおもった