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
というセキュアで便利なものである。
認証として利用する
認証として利用するためには、とても便利なライブラリがあるのでそちらを使う。
インストールに関しては、公式の方を参考にする。
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}
を付与すればできる。以下の記事が参考になる。
感想
- JWTを使った認証もライブラリのおかげで楽に実装
- ただ、JWTに関しては色々言われてるので利用する場合はちゃんと勉強しとかないとなとおもった