thinkphp3 php jwt,thinkphp框架使用JWTtoken的方法詳解

本文實例講述了thinkphp框架使用JWTtoken的方法。分享給大家供大家參考,具體如下:

簡介

一: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'];

希望本文所述對大家基于ThinkPHP框架的PHP程序設計有所幫助。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443057.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443057.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443057.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php 64位編碼解碼,php base64 編碼和解碼

/*** 自定義規則方式編碼和解碼**/public function test_changinttoStr () {$intvalue1 1232344234;$intStr ;$str "Y 9 L F k g y 5 R o v i x I 1 a O f 8 U h d s 3 r 4 D M p l Q Z J X P q e b E 0 W S j B n 7 w V z m N 2 G c 6 T H C A K u t";$seq expl…

matlab能力處理,書+程序《MATLAB圖像處理:能力提高與應用案例》趙小川

【實例簡介】MATLAB圖像處理能力提高與應用案例 [趙小川 編著] 2014年版,書程序(僅供學習)【實例截圖】【核心代碼】c3c59b5e-16c1-4bda-938e-8fcfb2ff870d└── 《MATLAB圖像處理:能力提高與應用案例》書程序├── 1.1 圖像多分辨率金字塔.zip├── 1.2圖像的矩…

wamp php啟動不成功,wamp的mysql 啟動失敗解決

wamp啟動失敗,查看原因是mysql 啟動失敗首先查看mysql的啟動日志命令:mysqld --console知道error報錯的地方:然后百度了此報錯,解決方法在my.ini中添加innodb_force_recovery 1發現這個會影響insert需要設置為 innodb_force_reco…

php復選框樣式,如何自定義checkbox樣式?附代碼

本篇文章給大家帶來的內容是關于如何自定義checkbox樣式?附代碼,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。修改原生checkbox樣式。效果原理1.利用CSS3屬性 appearance。該屬性(強制)更改(改變)默認(原生)樣式…

JAVA用數據留給出師表排序,如果諸葛亮會編程,用Java寫出師表...

繼上一篇 "如果諸葛亮用C#寫出師表..."后,站長想自己的第一語言是Java,雖然平時工作上用的不多,也用Java實現一遍吧,改改就是了,無非就是:C#的Console.WriteLine改為Java的System.out.println;C#…

python 橫坐標旋轉,python 橫坐標旋轉

數據旋轉公式x1cos(angle)*x-sin(angle)*y;y1cos(angle)*ysin(angle)*x;從數學上來說,此公式可以用來計算某個點繞另外一點旋轉一定角度后的坐標,例如:A(x,y)繞B(a,b)旋轉β度后的位置為C(c,d),…

php 數組區刪除重復的,php – 從數組中刪除重復的項目

我使用下面的代碼行來遍歷數據庫中的一個表:$items_thread $connection -> fetch_all($sql);如果我打印出來的陣列:print_r($items_thread);我會得到這個:Array([0] > Array([RecipientID] > 3[RecipientScreenname] > Tom L[Re…

python計算器教程,用Python程序制作一個簡單的計算器

用Python程序制作一個簡單的計算器在此示例中,您將學習創建一個簡單的計算器,該計算器可以根據用戶的輸入進行加,減,乘或除。要理解此示例,您應該了解以下Python編程主題:通過函數創建簡單計算器示例# 程序…

oracle表重命名 索引,CSS_在Oracle數據庫中按用戶名重建索引的方法,如果你管理的Oracle數據庫下某 - phpStudy...

在Oracle數據庫中按用戶名重建索引的方法如果你管理的Oracle數據庫下某些應用項目有大量的修改刪除操作, 數據索引是需要周期性的重建的.它不僅可以提高查詢性能, 還能增加索引表空間空閑空間大小.在ORACLE里大量刪除記錄后, 表和索引里占用的數據塊空間并沒有釋放.重建索引可以…

ora-01113 oracle8i,ora-01113解決辦法

今天在檢查接口機的時候,發現速度奇慢,于是,就差了一下v$session表,可是很不幸,查詢的速度慢的要命,原來的前幾天備份的時候出現的問題,沒辦法,關閉后重其一次吧,可是關閉…

oracle更換rac節點,Oracle-rac 更改VIP地址—2節點的

1、主機名規劃:--更改前:#Public Network - (eth0)ITPUB個人空間8Aw I"PbAv192.168.10.11 rac1G&n&uwk%m11386773192.168.10.12 rac2#Private Interconnect - (eth1)[V/{h4D(*f1L!J1138677310.10.10.11 rac1privH9RI(H/d.cP*UY1138677310.1…

Linux部署oracle11g,linux環境下部署Oracle11g

一、部署準備1、查看本地ssh服務Linux系統下安裝啟動ssh服務:1.檢查是否裝了SSH包rpm-qa |grep ssh2.沒有安裝SSH直接YUM安裝yuminstall openssh-server3.檢查SSH服務是否為開機啟動chkconfig--list sshd4.設置開機啟動SSH服務chkconfig--level 2345 sshd on5.重新啟…

php yii把pdf轉成圖片,yii實現圖片上傳及縮略圖生成的方法

這篇文章主要介紹了yii實現圖片上傳及縮略圖生成的方法,詳細分析了圖片的上傳及縮略圖的生成原理與實現方法,是非常實用的技巧,需要的朋友可以參考下本文實例講述了利用yii框架來實現圖片上傳功能并在上傳成功之后自動生成縮略圖的方法,分享給大家供大家參考。具體實…

linux下的安裝命令行工具下載,linux系統程序安裝(二)yum工具2-yum源及包下載

繼續我們的yum工具應用之旅,yum工具之所以方便就是因為有方便的在線云庫,實際工作中我們可能沒辦法鏈接互聯網,或者我們想安裝的程序原生源那么我們能不能用其他方式應用方便的yum源呢?一、使用光盤作為yum源1、將光盤掛載到/mnt目…

linux顯卡內核修改,iTOP-4412開發板-驅動-linux顯卡驅動的修改方法

本文檔介紹迅為4412開發板的顯卡分辨率修改方法。iTOP-4412 開發板支持 4.3 寸、7 寸和 9.7 寸等 lcd 顯示屏。其中 4.3 寸屏是用的 cpu直接出來的 RGB 信號,7 寸屏和 9.7 寸屏是用的 LVDS 信號,硬件上使用了一個 RGB 轉LVDS 的芯片實現的。我們來看下顯…

linux-如何限制普通用戶的磁盤使用空間-磁盤配額quota,Linux系統下如何進行磁盤配額Quota的設置...

Linux如何進行磁盤配額quota的設置通過quota進行磁盤配額,可以控制用戶對磁盤空間和文件的控制,我們以一個實例作為說明,對2個用戶user01、user02分別進行磁盤使用空間和創建文件的限制。首先,創建一個新的分區&#x…

linux一臺機器如何安裝兩個mysql,在一臺linux機器上啟動兩個mysql實例

環境:linux主機上已經yum安裝了mysql,而且數據庫正在運行。在不關閉/重啟mysql的情況下,重新啟動一個新的mysql實例,使用3307端口,實現一臺機器上同時運行兩個數據庫實例。1、創建新的mysql實例數據存儲目錄&#xff1…

linux和windows啟動,Linux和Windows雙系統的啟動

問題Linux和Windows雙系統的啟動解決方案在某些特殊情況下,服務器可能要安裝雙系統一個linux系統,一個windows系統這種情況下,安裝順序是,先裝Windows系統,后裝Linux這是因為,Linux的引導程序grub具備多系統…

體積最小桌面linux,Tiny Core Linux - 體積最小的精簡 Linux 操作系統發行版之一 (僅10多MB)...

Tiny Core Linux (TCL) 是一款極體積極小且高度可擴展的微型 Linux 發行版,它將一個 Linux 操作系統精簡到僅有 10 多 MB 左右的大小,似乎小巧得有點讓人嘆為觀止!要知道無論是常見的 Ubuntu、CentOS、Debian 的體積動輒就是幾百MB甚至要上GB…

linux下緩存命中測試,Linux 性能優化實戰(倪朋飛)---查看緩存命中情況

cachestat 提供了整個操作系統緩存的讀寫命中情況。cachetop 提供了每個進程的緩存命中情況。但是,cachetop 并不把直接 I/O 算進來。安裝 cachestat、cachetop:$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4052245BD4284CDD$ ech…