您好,登錄后才能下訂單哦!
本篇內容主要講解“thinkphp6中怎么使用jwt認證”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“thinkphp6中怎么使用jwt認證”吧!
客戶端使用用戶名和密碼請求登錄
服務端收到請求,驗證用戶名和密碼
驗證成功后,服務端會簽發一個token,再把這個token返回給客戶端
客戶端收到token后可以把它存儲起來,比如放到cookie中
客戶端每次向服務端請求資源時需要攜帶服務端簽發的token,可以在cookie或者header中攜帶
服務端收到請求,然后去驗證客戶端請求里面帶著的token,如果驗證成功,就向客戶端返回請求數據
composer require firebase/php-jwt
項目app 目錄下的 common.php全局文件使用的 ,做成了公共方法,由于我是多應用的,所以就寫在了api下面的common.php,大家可以根據自己需求適當調整
<?phpuse \Firebase\JWT\JWT;use Firebase\JWT\Key;// 應用公共文件/** * 生成驗簽 * @param $uid 用戶id * @return mixed */function signToken($uid){ $key='abcdefg'; //自定義的一個隨機字串用戶于加密中常用的 鹽 salt $token=array( "iss"=>$key, //簽發者 可以為空 "aud"=>'', //面象的用戶,可以為空 "iat"=>time(), //簽發時間 "nbf"=>time(), //在什么時候jwt開始生效 "exp"=> time()+30, //token 過期時間 "data"=>[ //記錄的uid的信息 'uid'=>$uid, ] ); $jwt = JWT::encode($token, $key, "HS256"); //生成了 token return $jwt;}/** * 驗證token * @param $token * @return array|int[] */function checkToken($token){ $key='abcdefg'; //自定義的一個隨機字串用戶于加密中常用的 鹽 salt $res['status'] = false; try { JWT::$leeway = 60;//當前時間減去60,把時間留點余地 $decoded = JWT::decode($token, new Key($key, 'HS256')); //HS256方式,這里要和簽發的時候對應 $arr = (array)$decoded; $res['status'] = 200; $res['data'] =(array)$arr['data']; return $res; } catch(\Firebase\JWT\SignatureInvalidException $e) { //簽名不正確 $res['info'] = "簽名不正確"; return $res; }catch(\Firebase\JWT\BeforeValidException $e) { // 簽名在某個時間點之后才能用 $res['info'] = "token失效"; return $res; }catch(\Firebase\JWT\ExpiredException $e) { // token過期 $res['info'] = "token過期"; return $res; }catch(Exception $e) { //其他錯誤 $res['info'] = "未知錯誤"; return $res; }}
/** * 使用jwt生成token字符串 */ public function setJwtToken() { $uid = input('uid'); // 接收生成token字符串 如:123 $token = signToken($uid); // 生成字符串: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhYmNkZWZnIiwiYXVkIjoiIiwiaWF0IjoxNjQxNDUwMTU0LCJuYmYiOjE2NDE0NTAxNTcsImV4cCI6MTY0MTQ1NzM1NCwiZGF0YSI6eyJ1aWQiOiIxMjMifX0.I_GAkMsOhtEpIPkizCuQA-b9H6ovSovWx0AwAYI-b0s echo $token;die; } /** * 使用jwt驗證token字符串 */ public function checkJwtToken() { $token = input('token'); // 接收生成token字符串 $result = checkToken($token); // Array ( [status] => 200 [data] => Array ( [uid] => 123 ) ) print_r($result);die; }
<?phpdeclare (strict_types = 1);namespace app\api\controller;use think\facade\Db;use think\Request;class User{ public function login(Request $request) { if ($request->isPost()){ $username = $request->param('username','','trim'); $password = $request->param('password','','trim'); //查詢數據庫 $user = Db::name('user')->where('username',$username)->find(); if (!$user){ return json(['status' => 'fail','msg' => '用戶名不存在']); } if ($user['password']!==md5($password)){ return json(['status' => 'fail','msg' => '密碼錯誤']); } $getToken = $this->token($user); return json(['status' => 'success','msg' => '登陸成功','token' => $getToken]); } } public function token($user) { $uid = $user['username']; // 接收生成token字符串 如:123 $token = signToken($uid); dd($token); } /** * 驗證token */ public function chToken() { $token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhYmNkZWZnIiwiYXVkIjoiIiwiaWF0IjoxNjQ4MDkwMDkyLCJuYmYiOjE2NDgwOTAwOTIsImV4cCI6MTY0ODA5MDEyMiwiZGF0YSI6eyJ1aWQiOiJcdTVmMjBcdTRlMDlcdTk4Y2UifX0.oJFpNcZ6stMymOCbD-meX0IPEIYLYNcwKxhMItF2cMw'; $result = checkToken($token); // Array ( [status] => 200 [data] => Array ( [uid] => 123 ) ) print_r($result);die; }}
用戶登錄成功返回給前端token,前端將token存儲起來,在下次請求的時候頭部攜帶著這個token,后端接受token,在中間件中進行驗證
<?phpdeclare (strict_types = 1);namespace app\middleware;class Api{ /** * 處理請求 * * @param \think\Request $request * @param \Closure $next * @return Response */ public function handle($request, \Closure $next) { //toke 合法性驗證 $header = $request->header(); //判讀請求頭里有沒有token if(!isset($header['token'])){ return json(['code'=>440,'msg'=>'request must with token']); } $token = $header['token']; try { // token 合法 $token = checkToken($token); }catch (\Exception $e){ return json(['code'=>440,'msg'=>'invalid token']); } return $next($request); }}
到此,相信大家對“thinkphp6中怎么使用jwt認證”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。