欧美亚洲中文,在线国自产视频,欧洲一区在线观看视频,亚洲综合中文字幕在线观看

      1. <dfn id="rfwes"></dfn>
          <object id="rfwes"></object>
        1. 站長(zhǎng)資訊網(wǎng)
          最全最豐富的資訊網(wǎng)站

          實(shí)例詳解thinkphp6使用jwt認(rèn)證

          本篇文章給大家?guī)?lái)了關(guān)于thinkphp的相關(guān)知識(shí),其中主要介紹了使用jwt認(rèn)證的問(wèn)題,下面一起來(lái)看一下,希望對(duì)大家有幫助。

          實(shí)例詳解thinkphp6使用jwt認(rèn)證

          推薦學(xué)習(xí):《PHP視頻教程》

          thinkphp6 使用jwt

          1. 客戶端使用用戶名和密碼請(qǐng)求登錄
          2. 服務(wù)端收到請(qǐng)求,驗(yàn)證用戶名和密碼
          3. 驗(yàn)證成功后,服務(wù)端會(huì)簽發(fā)一個(gè)token,再把這個(gè)token返回給客戶端
          4. 客戶端收到token后可以把它存儲(chǔ)起來(lái),比如放到cookie中
          5. 客戶端每次向服務(wù)端請(qǐng)求資源時(shí)需要攜帶服務(wù)端簽發(fā)的token,可以在cookie或者h(yuǎn)eader中攜帶
          6. 服務(wù)端收到請(qǐng)求,然后去驗(yàn)證客戶端請(qǐng)求里面帶著的token,如果驗(yàn)證成功,就向客戶端返回請(qǐng)求數(shù)據(jù)

          安裝 jwt 擴(kuò)展

          composer require firebase/php-jwt

          安裝之后在 vender 目錄下的 firebase 文件夾下

          實(shí)例詳解thinkphp6使用jwt認(rèn)證

          調(diào)用 JWT里面的 encode 和 decode方法進(jìn)行生成token和驗(yàn)證token

          項(xiàng)目app 目錄下的 common.php全局文件使用的 ,做成了公共方法,由于我是多應(yīng)用的,所以就寫(xiě)在了api下面的common.php,大家可以根據(jù)自己需求適當(dāng)調(diào)整

          實(shí)例詳解thinkphp6使用jwt認(rèn)證

          首先 引入 JWT ,然后寫(xiě)兩個(gè)方法,生成驗(yàn)簽和驗(yàn)證token。

          <?phpuse FirebaseJWTJWT;use FirebaseJWTKey;// 應(yīng)用公共文件/**  * 生成驗(yàn)簽  * @param $uid 用戶id  * @return mixed  */function signToken($uid){     $key='abcdefg';         //自定義的一個(gè)隨機(jī)字串用戶于加密中常用的 鹽  salt     $token=array(         "iss"=>$key,        //簽發(fā)者 可以為空         "aud"=>'',          //面象的用戶,可以為空         "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ī)字串用戶于加密中常用的 鹽  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(FirebaseJWTSignatureInvalidException $e) { //簽名不正確         $res['info']    = "簽名不正確";         return $res;     }catch(FirebaseJWTBeforeValidException $e) { // 簽名在某個(gè)時(shí)間點(diǎn)之后才能用         $res['info']    = "token失效";         return $res;     }catch(FirebaseJWTExpiredException $e) { // token過(guò)期         $res['info']    = "token過(guò)期";         return $res;     }catch(Exception $e) { //其他錯(cuò)誤         $res['info']    = "未知錯(cuò)誤";         return $res;     }}

          使用jwt生成token

              /**      * 使用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;     }

          創(chuàng)建 user 控制器

          <?phpdeclare (strict_types = 1);namespace appapicontroller;use thinkfacadeDb;use thinkRequest;class User{     public function login(Request $request)     {         if ($request->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' => '用戶名不存在']);             }             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;     }}

          用戶登錄成功返回給前端token,前端將token存儲(chǔ)起來(lái),在下次請(qǐng)求的時(shí)候頭部攜帶著這個(gè)token,后端接受token,在中間件中進(jìn)行驗(yàn)證

          創(chuàng)建api中間件

          <?phpdeclare (strict_types = 1);namespace appmiddleware;class Api{     /**      * 處理請(qǐng)求      *      * @param thinkRequest $request      * @param Closure       $next      * @return Response      */     public function handle($request, Closure $next)     {         //toke 合法性驗(yàn)證         $header = $request->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);     }}

          最后,關(guān)于如何處理token過(guò)期的問(wèn)題,有兩種解決辦法,第一種就是,將token的時(shí)間設(shè)置長(zhǎng)一些,這樣token就不會(huì)過(guò)期,但是這樣就有一個(gè)弊端,一旦客戶端拿到了這個(gè)token就相當(dāng)于有了密鑰,主動(dòng)權(quán)也就掌握在了用戶的手上。所以不推薦這種方案。第二種就是,后端處理,當(dāng)token過(guò)期的時(shí)候重新獲取token,將新的token傳給前端,前端在將新的token存儲(chǔ)起來(lái),替換掉原來(lái)的token,下一次請(qǐng)求的時(shí)候就攜帶著新的token請(qǐng)求。

          我是程序員峰峰,一名愛(ài)學(xué)習(xí),愛(ài)折騰的程序員。

          推薦學(xué)習(xí):《PHP視頻教程》

          贊(0)
          分享到: 更多 (0)
          網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)