PHP實現JWT的Token登錄認證
<link rel="stylesheet" href="https://js.how234.com/third-party/SyntaxHighlighter/shCoreDefault.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/third-party/SyntaxHighlighter/shCore.js"></script><script type="text/javascript"> SyntaxHighlighter.all(); </script>
1、JWT簡介
JSON Web Token(縮寫 JWT),是目前最流行的跨域認證解決方案。
session登錄認證方案:用戶從客戶端傳遞用戶名、密碼等信息,服務端認證後將信息存儲在session中,將session_id放到cookie中。
以後訪問其他頁面,自動從cookie中取到session_id,再從session中取認證信息。
另一類解決方案,將認證信息,返回給客戶端,存儲到客戶端。下次訪問其他頁面,需要從客戶端傳遞認證信息回服務端。
JWT就是這類方案的代表,將認證信息保存在客戶端。
2、JWT 的原理
JWT 的原理是,服務器認證以後,生成一個 JSON格式的 對象,發回給客戶端,就像下面這樣。
{"用戶名": "admin","角色": "超級管理員","到期時間": "2019-07-13 00:00:00"}
以後,客戶端與服務端通信的時候,都要發回這個 JSON 對象。服務器完全只靠這個對象認定用戶身份。
爲了防止用戶篡改數據,服務器在生成這個對象的時候,會加上簽名(詳見後文)。
服務器不再保存任何 session 數據,也就是服務器變成無狀態了,從而比較容易實現擴展。
3、JWT 的使用方式
客戶端收到服務器返回的 JWT,可以儲存在 Cookie 裏面,也可以儲存在 localStorage。
此後,客戶端每次與服務器通信,都要帶上這個 JWT。你可以把它放在 Cookie 裏面自動發送,但是這樣不能跨域,所以更好的做法是放在 HTTP 請求的頭信息Authorization
字段裏面。
Authorization: Bearer
另一種做法是,跨域的時候,JWT 就放在 POST 請求的數據體裏面。
4、JWT 的幾個特點
(1)JWT 默認是不加密,但也是可以加密的。生成原始 Token 以後,可以用密鑰再加密一次。
(2)JWT 不加密的情況下,不能將祕密數據寫入 JWT。
(3)JWT 不僅可以用於認證,也可以用於交換信息。有效使用 JWT,可以降低服務器查詢數據庫的次數。
(4)JWT 的最大缺點是,由於服務器不保存 session 狀態,因此無法在使用過程中廢止某個 token,或者更改 token 的權限。也就是說,一旦 JWT 簽發了,在到期之前就會始終有效,除非服務器部署額外的邏輯。
(5)JWT 本身包含了認證信息,一旦泄露,任何人都可以獲得該令牌的所有權限。爲了減少盜用,JWT 的有效期應該設置得比較短。對於一些比較重要的權限,使用時應該再次對用戶進行認證。
(6)爲了減少盜用,JWT 不應該使用 HTTP 協議明碼傳輸,要使用 HTTPS 協議傳輸。
5、功能實現
JWT功能組件
使用composer安裝 JWT 功能組件
composer require lcobucci/jwt 3.3
封裝JWT工具類
extend/tools/jwt/Token.php
'http://www.pyg.com',//接收人 'id' => '3f2g57a92aa',//token的唯一標識,這裏只是一個簡單示例 'sign' => 'pinyougou',//簽名密鑰 'issuer' => 'http://adminapi.pyg.com',//簽發人 'expire' => 3600*24 //有效期 ]; //生成token public static function getToken($user_id){ //簽名對象 $signer = new Sha256(); //獲取當前時間戳 $time = time(); //設置簽發人、接收人、唯一標識、簽發時間、立即生效、過期時間、用戶id、簽名 $token = (new Builder())->issuedBy(self::$_config['issuer']) ->canOnlyBeUsedBy(self::$_config['audience']) ->identifiedBy(self::$_config['id'], true) ->issuedAt($time) ->canOnlyBeUsedAfter($time-1) ->expiresAt($time + self::$_config['expire']) ->with('user_id', $user_id) ->sign($signer, self::$_config['sign']) ->getToken(); return (string)$token; } //從請求信息中獲取token令牌 public static function getRequestToken() { if (empty($_SERVER['HTTP_AUTHORIZATION'])) { return false; } $header = $_SERVER['HTTP_AUTHORIZATION']; $method = 'bearer'; //去除token中可能存在的bearer標識 return trim(str_ireplace($method, '', $header)); } //從token中獲取用戶id (包含token的校驗) public static function getUserId($token = null) { $user_id = null; $token = empty($token)?self::getRequestToken():$token; if (!empty($token)) { //爲了註銷token 加以下if判斷代碼 $delete_token = cache('delete_token') ?: []; if(in_array($token, $delete_token)){ //token已被刪除(註銷) return $user_id; } $token = (new Parser())->parse((string) $token); //驗證token $data = new ValidationData(); $data->setIssuer(self::$_config['issuer']);//驗證的簽發人 $data->setAudience(self::$_config['audience']);//驗證的接收人 $data->setId(self::$_config['id']);//驗證token標識 if (!$token->validate($data)) { //token驗證失敗 return $user_id; } //驗證簽名 $signer = new Sha256(); if (!$token->verify($signer, self::$_config['sign'])) { //簽名驗證失敗 return $user_id; } //從token中獲取用戶id $user_id = $token->getClaim('user_id'); } return $user_id; }}
修改public/.htaccess
文件,通過apache重寫,處理HTTP請求
中的Authorization
字段
(不處理,php中接收不到HTTP_AUTHORAZATION
字段信息)
RewriteCond %{HTTP:Authorization} ^(.+)$RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
測試: application/adminapi/controller/Index.php
中index
方法
靜態調用封裝的oolsjwtToken
類的getToken
方法,傳遞一個用戶id
值,生成token
靜態調用封裝的oolsjwtToken
類的getUserId
方法,傳遞一個token
,獲取用戶id
值
訪問結果
到此這篇關於PHP實現JWT的Token登錄認證的文章就介紹到這了,希望對大家的學習有所幫助。
-
日薄西山的薄什麼意思,日薄西山的薄的意思解釋
1、“薄”在此處的意思是:迫近,靠近。2、“日薄西山”的意思是:指太陽快要落山。比喻人到老年或腐朽的事物衰敗接近滅亡。3、出處:晉·李密《陳情表》:“但以劉日薄西山,氣息奄奄,人命危淺,朝不慮夕。”4、白話釋義:只是因爲祖母劉氏壽命即將終了,氣息微弱,生命垂危,早上不...
-
心樂之原文及翻譯
1、心樂之的樂意思:以……爲樂,對……感到快樂。2、原文:《小石潭記》【作者】柳宗元【朝代】唐從小丘西行百二十步,隔篁竹,聞水聲,如鳴珮環,心樂之。伐竹取道,下見小潭,水尤清冽。全石以爲底,近岸,卷石底以出,爲坻,爲嶼,爲嵁,爲巖。青樹翠蔓,蒙絡搖綴,參差披拂。潭中魚可百許頭...
-
名人勵志小故事
1、越王勾踐被吳國軍隊打敗,忍受奇恥大辱,給吳王夫差當奴僕.三年後,他被釋放回國,立志洗雪國恥.他臥薪嚐膽,發憤圖強,終於打敗了吳國。2、包拯包青天,聰穎,勤學好問,尤喜推理斷案,其家父與知縣交往密切,包拯從小耳濡目染,學會了不少的斷案知識,尤其在焚廟殺僧一案中,包拯根據...
-
用怨言造句子
造句指懂得並使用字詞,按照一定的句法規則造出字詞通順、意思完整、符合邏輯的句子。依據現代語文學科特徵,可延伸爲寫段、作文的基礎,是學生寫好作文的基本功。造句來源清俞樾《春在堂隨筆》卷八:“其用意,其造句,均以纖巧勝。”夏丏尊葉聖陶《文心雕龍》四:“造句也...