最近項目作API認證,最終技術選型決定使用JWT,項目框架使用的是laravel,laravel使用JWT有比較方便使用的開源包:jwt-auth。 使用composer安裝jwt-auth,laravel使用的框架版本爲5.0,jwt-auth最新穩定版本爲0.5.12。(最新版爲1.0.*,需laravel5.4以上)
composer require tymon/jwt-auth 0.5.*
安裝完成後,須要在config/app.php中註冊相應的服務提供者:
'providers' => [ 'Tymon\JWTAuth\Providers\JWTAuthServiceProvider', ],
而後註冊須要用到的對應門面:
'aliases' => [ 'JWTAuth' => 'Tymon\JWTAuth\Facades\JWTAuth', 'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory', ],
而後發佈相應配置文件:此命令會在 config 目錄下生成一個 jwt.php 配置文件,你能夠在此進行自定義配置。
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"
最後生成密鑰:此命令會在你的 .env 文件中新增一行 JWT_SECRET=secret
php artisan jwt:generate
生成TOKEN,生成TOKEN有多種方式:下面介紹兩種
1、根據模型爲基礎生成TOKEN:php
根據模型生成TOKEN需在config/auth.php指定使用哪一個模型。
'model' => 'App\Models\Members',
在模型文件Members.php中需添加
namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Auth\Authenticatable; use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract; class Members extends Model implements AuthenticatableContract { use Authenticatable; ... }
根據模型生成TOKEN
$member = \App\Models\Members::where('id',7)->select('id','username')->first(); $token = \JWTAuth::fromUser($member); echo $token;exit;
2、自定義生成TOKEN:laravel
$customClaims = ['sub' => [ 'id' => '7', 'name' => 'kocor', ]]; $payload = \JWTFactory::make($customClaims); $token = \JWTAuth::encode($payload); echo $token;exit;
解密提取TOKEN信息json
提取TOKEN信息
$user_info = JWTAuth::parseToken()->authenticate()
刷新TOKEN
$newToken = JWTAuth::refresh($_REQUEST['token']);
使用實例
use Tymon\JWTAuth\Exceptions\JWTException; use Tymon\JWTAuth\Exceptions\TokenExpiredException; use Tymon\JWTAuth\Exceptions\TokenInvalidException; //JWT提取會員信息 try { if (! $user_info = JWTAuth::parseToken()->authenticate()) { return Api::arr(config('statusCode.jwt_user_not_found'), trans('message.jwt_user_not_found').':404'); } //在token有效期內容許刷新 $newToken = JWTAuth::refresh($_REQUEST['token']); return Api::json(config('statusCode.success'), trans('message.success'),$newToken); } catch (TokenExpiredException $e) { try { //在刷新有效期內 $newToken = JWTAuth::refresh($_REQUEST['token']); return Api::json(config('statusCode.success'), trans('message.success'),$newToken); } catch (JWTException $e) { // 過時用戶 return Api::json(config('statusCode.jwt_token_expired'), trans('message.jwt_token_expired').$e->getStatusCode()); } //無效的token } catch (TokenInvalidException $e) { return Api::json(config('statusCode.jwt_token_invalid'), trans('message.jwt_token_invalid').$e->getStatusCode()); //token不存在 } catch (JWTException $e) { return Api::json(config('statusCode.jwt_token_absent'), trans('message.jwt_token_absent').$e->getStatusCode()); }
by kocorapp