您好,登錄后才能下訂單哦!
JWTtoken怎么在thinkphp框架中使用?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
一:JWT介紹:全稱JSON Web Token,基于JSON的開放標準((RFC 7519) ,以token的方式代替傳統的Cookie-Session模式,用于各服務器、客戶端傳遞信息簽名驗證。
二:JWT優點:
1:服務端不需要保存傳統會話信息,沒有跨域傳輸問題,減小服務器開銷。
2:jwt構成簡單,占用很少的字節,便于傳輸。
3:json格式通用,不同語言之間都可以使用。
三:JWT組成
1:jwt由三部分組成:
頭部(header)
載荷(payload) 包含一些定義信息和自定義信息
簽證(signature)
2:具體構成:
header:
{ "typ": "JWT", //聲明類型為jwt "alg": "HS256" //聲明簽名算法為SHA256 }
載荷(payload)
{ "iss": "http://www.helloweba.net", "aud": "http://www.helloweba.net", "iat": 1525317601, "nbf": 1525318201, "exp": 1525318201, "data": { "userid": 1, "username": "李小龍" } }
載荷包括兩部分:標準聲明和其他聲明。
標準聲明:JWT標準規定的聲明,但不是必須填寫的;
標準聲明字段:
接收該JWT的一方
iss: jwt簽發者
sub: jwt所面向的用戶
aud: 接收jwt的一方
exp: jwt的過期時間,過期時間必須要大于簽發時間
nbf: 定義在什么時間之前,某個時間點后才能訪問
iat: jwt的簽發時間
jti: jwt的唯一身份標識,主要用來作為一次性token。
下載
composer require firebase/php-jwt
extend 下創建token類
namespace Token; use think\Controller; use think\facade\Request; use Firebase\JWT\JWT; /**token類 * Class Token * @package app\api\Controller */ class Token { /** * 創建 token * @param array $data 必填 自定義參數數組 * @param integer $exp_time 必填 token過期時間 單位:秒 例子:7200=2小時 * @param string $scopes 選填 token標識,請求接口的token * @return string */ private $TokenKey = "123456"; public function createToken($data="",$exp_time=0,$scopes=""){ //JWT標準規定的聲明,但不是必須填寫的; //iss: jwt簽發者 //sub: jwt所面向的用戶 //aud: 接收jwt的一方 //exp: jwt的過期時間,過期時間必須要大于簽發時間 //nbf: 定義在什么時間之前,某個時間點后才能訪問 //iat: jwt的簽發時間 //jti: jwt的唯一身份標識,主要用來作為一次性token。 //公用信息 try { $key=$this->TokenKey; $time = time(); //當前時間 //$token['iss']=''; //簽發者 可選 //$token['aud']=''; //接收該JWT的一方,可選 $token['iat']=$time; //簽發時間 $token['nbf']=$time; //(Not Before):某個時間點后才能訪問,比如設置time+30,表示當前時間30秒后才能使用 if($scopes){ $token['scopes']=$scopes; //token標識,請求接口的token } if(!$exp_time){ $exp_time=7200;//默認=2小時過期 } $token['exp']=$time+$exp_time; //token過期時間,這里設置2個小時 if($data){ $token['data']=$data; //自定義參數 } $json = JWT::encode($token,$key); $returndata['status']="200";// $returndata['msg']='success'; $returndata['token']= $json;//返回的數據 return $returndata; //返回信息 }catch(\Firebase\JWT\ExpiredException $e){ //簽名不正確 $returndata['status']="104";//101=簽名不正確 $returndata['msg']=$e->getMessage(); $returndata['data']="";//返回的數據 return $returndata; //返回信息 }catch(\Exception $e) { //其他錯誤 $returndata['status']="199";//199=簽名不正確 $returndata['msg']=$e->getMessage(); $returndata['data']="";//返回的數據 return $returndata; //返回信息 } } /** * 驗證token是否有效,默認驗證exp,nbf,iat時間 * @param string $jwt 需要驗證的token * @return string $msg 返回消息 */ public function checkToken($jwt){ $key=$this->TokenKey; try { JWT::$leeway = 60;//當前時間減去60,把時間留點余地 $decoded = JWT::decode($jwt, $key, ['HS256']); //HS256方式,這里要和簽發的時候對應 $arr = (array)$decoded; $returndata['status']="200";//200=成功 $returndata['msg']="success";// $returndata['data']=$arr;//返回的數據 return $returndata; //返回信息 } catch(\Firebase\JWT\SignatureInvalidException $e) { //簽名不正確 $returndata['status']="101";//101=簽名不正確 $returndata['msg']=$e->getMessage(); $returndata['data']="";//返回的數據 //return json_encode($returndata); //返回信息 //exit(json_encode($returndata)); sendResponse($returndata,401,'Unauthorized'); }catch(\Firebase\JWT\BeforeValidException $e) { // 簽名在某個時間點之后才能用 $returndata['status']="102"; $returndata['msg']=$e->getMessage(); $returndata['data']="";//返回的數據 sendResponse($returndata,401,'Unauthorized'); }catch(\Firebase\JWT\ExpiredException $e) { // token過期 $returndata['status']="103";//103=簽名不正確 $returndata['msg']=$e->getMessage(); $returndata['data']="";//返回的數據 sendResponse($returndata,401,'Unauthorized'); }catch(\Exception $e) { //其他錯誤 $returndata['status']="199";//199=簽名不正確 $returndata['msg']=$e->getMessage(); $returndata['data']="";//返回的數據 sendResponse($returndata,401,'Unauthorized'); } //Firebase定義了多個 throw new,我們可以捕獲多個catch來定義問題,catch加入自己的業務,比如token過期可以用當前Token刷新一個新Token }
簽發
$jwtToken = new Token(); $tokenData = array( 'openid' => $user->getId(), 'uniacid' => $_W['uniacid'], ); $token = $jwtToken->createToken($tokenData)
驗證
if (empty($_SERVER['HTTP_AUTHORIZATION'])) { $res['status']="201"; $res['msg']="no token"; $res['data']="";//返回的數據 sendResponse($res,401,'Unauthorized'); } $token = $_SERVER['HTTP_AUTHORIZATION']; $jwtToken = new Token(); $checkToken = $jwtToken->checkToken($token); $data = (array)$checkToken['data']['data'];
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。