本篇內(nèi)容主要講解“thinkphp6中怎么使用jwt認(rèn)證”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“thinkphp6中怎么使用jwt認(rèn)證”吧!
創(chuàng)新互聯(lián)為企業(yè)級(jí)客戶(hù)提高一站式互聯(lián)網(wǎng)+設(shè)計(jì)服務(wù),主要包括網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、App定制開(kāi)發(fā)、微信小程序定制開(kāi)發(fā)、宣傳片制作、LOGO設(shè)計(jì)等,幫助客戶(hù)快速提升營(yíng)銷(xiāo)能力和企業(yè)形象,創(chuàng)新互聯(lián)各部門(mén)都有經(jīng)驗(yàn)豐富的經(jīng)驗(yàn),可以確保每一個(gè)作品的質(zhì)量和創(chuàng)作周期,同時(shí)每年都有很多新員工加入,為我們帶來(lái)大量新的創(chuàng)意。
客戶(hù)端使用用戶(hù)名和密碼請(qǐng)求登錄
服務(wù)端收到請(qǐng)求,驗(yàn)證用戶(hù)名和密碼
驗(yàn)證成功后,服務(wù)端會(huì)簽發(fā)一個(gè)token,再把這個(gè)token返回給客戶(hù)端
客戶(hù)端收到token后可以把它存儲(chǔ)起來(lái),比如放到cookie中
客戶(hù)端每次向服務(wù)端請(qǐng)求資源時(shí)需要攜帶服務(wù)端簽發(fā)的token,可以在cookie或者h(yuǎn)eader中攜帶
服務(wù)端收到請(qǐng)求,然后去驗(yàn)證客戶(hù)端請(qǐng)求里面帶著的token,如果驗(yàn)證成功,就向客戶(hù)端返回請(qǐng)求數(shù)據(jù)
composer require firebase/php-jwt
項(xiàng)目app 目錄下的 common.php全局文件使用的 ,做成了公共方法,由于我是多應(yīng)用的,所以就寫(xiě)在了api下面的common.php,大家可以根據(jù)自己需求適當(dāng)調(diào)整
$key, //簽發(fā)者 可以為空 "aud"=>'', //面象的用戶(hù),可以為空 "iat"=>time(), //簽發(fā)時(shí)間 "nbf"=>time(), //在什么時(shí)候jwt開(kāi)始生效 "exp"=> time()+30, //token 過(guò)期時(shí)間 "data"=>[ //記錄的uid的信息 'uid'=>$uid, ] ); $jwt = JWT::encode($token, $key, "HS256"); //生成了 token return $jwt;}/** * 驗(yàn)證token * @param $token * @return array|int[] */function checkToken($token){ $key='abcdefg'; //自定義的一個(gè)隨機(jī)字串用戶(hù)于加密中常用的 鹽 salt $res['status'] = false; try { JWT::$leeway = 60;//當(dāng)前時(shí)間減去60,把時(shí)間留點(diǎn)余地 $decoded = JWT::decode($token, new Key($key, 'HS256')); //HS256方式,這里要和簽發(fā)的時(shí)候?qū)?yīng) $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) { // 簽名在某個(gè)時(shí)間點(diǎn)之后才能用 $res['info'] = "token失效"; return $res; }catch(\Firebase\JWT\ExpiredException $e) { // token過(guò)期 $res['info'] = "token過(guò)期"; return $res; }catch(Exception $e) { //其他錯(cuò)誤 $res['info'] = "未知錯(cuò)誤"; 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驗(yàn)證token字符串 */ public function checkJwtToken() { $token = input('token'); // 接收生成token字符串 $result = checkToken($token); // Array ( [status] => 200 [data] => Array ( [uid] => 123 ) ) print_r($result);die; }
isPost()){ $username = $request->param('username','','trim'); $password = $request->param('password','','trim'); //查詢(xún)數(shù)據(jù)庫(kù) $user = Db::name('user')->where('username',$username)->find(); if (!$user){ return json(['status' => 'fail','msg' => '用戶(hù)名不存在']); } if ($user['password']!==md5($password)){ return json(['status' => 'fail','msg' => '密碼錯(cuò)誤']); } $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); } /** * 驗(yàn)證token */ public function chToken() { $token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhYmNkZWZnIiwiYXVkIjoiIiwiaWF0IjoxNjQ4MDkwMDkyLCJuYmYiOjE2NDgwOTAwOTIsImV4cCI6MTY0ODA5MDEyMiwiZGF0YSI6eyJ1aWQiOiJcdTVmMjBcdTRlMDlcdTk4Y2UifX0.oJFpNcZ6stMymOCbD-meX0IPEIYLYNcwKxhMItF2cMw'; $result = checkToken($token); // Array ( [status] => 200 [data] => Array ( [uid] => 123 ) ) print_r($result);die; }}
用戶(hù)登錄成功返回給前端token,前端將token存儲(chǔ)起來(lái),在下次請(qǐng)求的時(shí)候頭部攜帶著這個(gè)token,后端接受token,在中間件中進(jìn)行驗(yàn)證
header(); //判讀請(qǐng)求頭里有沒(méi)有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); }}
到此,相信大家對(duì)“thinkphp6中怎么使用jwt認(rèn)證”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!