Laravel基於類庫Firebase/php-jwt 的JWT加密實現
阿新 • • 發佈:2018-12-16
- 安裝類庫
composer require firebase/php-jwt
2.登入介面。
引入類庫(use Firebase\JWT\JWT; )->查詢資料庫使用者名稱、密碼正確->生成Token並返回
public function login(Request $request) { $user_name = $request->get('username',''); $password = $request->get('password',''); $user = Users::where(['username' => $user_name,'password' => $password])->first(); if(!$user) { return response()->json('使用者名稱或密碼錯誤!'); } unset($user['password']); //登入成功token $token = $this->getJWTToken($user); cache('user-'.$user['id'],$user); return response()->json(['token' => $token]); } public function getJWTToken($value) { $time = time(); $payload = [ 'iat' => $time, 'nbf' => $time, 'exp' => $time+7200, 'data' => [ 'id' => $value['id'], 'username' => $value['user_name'] ] ]; $key = env('JWT_SECRET'); $alg = 'HS256'; $token = JWT::encode($payload,$key,$alg); return $token; }
配置路由:
Route::post('/login', 'Auth\LoginCon[email protected]');
結果如下:
3.建立驗證token是否合法的中介軟體 php artisan make:middleware AuthToken
檔案程式碼如下:
public function handle($request, Closure $next) { $alg = [ "typ" => "JWT", //宣告型別為jwt "alg" => "HS256" //宣告簽名演算法為SHA256 ]; $jwt = $request->header('token'); $key = env('JWT_SECRET'); try{ JWT::decode($jwt,$key,$alg); } catch (\Exception $e) { return response()->json('token無效:'.$e); } return $next($request); }
在kernel.php檔案中$routeMiddleware加入中介軟體
4.建立測試介面
路由配置:
Route::get('/user', '[email protected]')->middleware('auth.token');
用登入介面生成的token,寫入/user介面的header位置進行測試
如果token不正確,結果如下:具體的返回錯誤可以檢視類庫中的JWT.php中decode方法中返回錯誤,然後自己改寫。