<th id="wu2k2"><s id="wu2k2"></s></th> <blockquote id="wu2k2"></blockquote>
  • <tr id="wu2k2"></tr>
  • <samp id="wu2k2"><tbody id="wu2k2"></tbody></samp><samp id="wu2k2"><tbody id="wu2k2"></tbody></samp>
  • 更多精彩內(nèi)容,歡迎關(guān)注:

    視頻號(hào)
    視頻號(hào)

    抖音
    抖音

    快手
    快手

    微博
    微博

    PHP實(shí)現(xiàn)JWT的Token登錄認(rèn)證

    導(dǎo)讀這篇文章通過(guò)實(shí)例代碼介紹了PHP實(shí)現(xiàn)JWT的Token登錄認(rèn)證的方式,session登錄認(rèn)證方案:用戶從客戶端傳遞用戶名、密碼等信息,服務(wù)端認(rèn)證后將信息存儲(chǔ)在session中,將session_id放到cookie中。
    1、JWT簡(jiǎn)介

    JSON Web Token(縮寫(xiě) JWT),是目前最流行的跨域認(rèn)證解決方案。

    session登錄認(rèn)證方案:用戶從客戶端傳遞用戶名、密碼等信息,服務(wù)端認(rèn)證后將信息存儲(chǔ)在session中,將session_id放到cookie中。

    以后訪問(wèn)其他頁(yè)面,自動(dòng)從cookie中取到session_id,再?gòu)膕ession中取認(rèn)證信息。

    另一類(lèi)解決方案,將認(rèn)證信息,返回給客戶端,存儲(chǔ)到客戶端。下次訪問(wèn)其他頁(yè)面,需要從客戶端傳遞認(rèn)證信息回服務(wù)端。

    JWT就是這類(lèi)方案的代表,將認(rèn)證信息保存在客戶端。

    2、JWT 的原理

    JWT 的原理是,服務(wù)器認(rèn)證以后,生成一個(gè) JSON格式的 對(duì)象,發(fā)回給客戶端,就像下面這樣。

    {
    "用戶名":?"admin",
    "角色":?"超級(jí)管理員",
    "到期時(shí)間":?"2019-07-13?00:00:00"
    }

    以后,客戶端與服務(wù)端通信的時(shí)候,都要發(fā)回這個(gè) JSON 對(duì)象。服務(wù)器完全只靠這個(gè)對(duì)象認(rèn)定用戶身份。

    為了防止用戶篡改數(shù)據(jù),服務(wù)器在生成這個(gè)對(duì)象的時(shí)候,會(huì)加上簽名(詳見(jiàn)后文)。

    服務(wù)器不再保存任何 session 數(shù)據(jù),也就是服務(wù)器變成無(wú)狀態(tài)了,從而比較容易實(shí)現(xiàn)擴(kuò)展。

    3、JWT 的使用方式

    客戶端收到服務(wù)器返回的 JWT,可以儲(chǔ)存在 Cookie 里面,也可以儲(chǔ)存在 localStorage。

    此后,客戶端每次與服務(wù)器通信,都要帶上這個(gè) JWT。你可以把它放在 Cookie 里面自動(dòng)發(fā)送,但是這樣不能跨域,所以更好的做法是放在 HTTP 請(qǐng)求的頭信息Authorization字段里面。

    Authorization:?Bearer

    另一種做法是,跨域的時(shí)候,JWT 就放在 POST 請(qǐng)求的數(shù)據(jù)體里面。

    4、JWT 的幾個(gè)特點(diǎn)

    (1)JWT 默認(rèn)是不加密,但也是可以加密的。生成原始 Token 以后,可以用密鑰再加密一次。

    (2)JWT 不加密的情況下,不能將秘密數(shù)據(jù)寫(xiě)入 JWT。

    (3)JWT 不僅可以用于認(rèn)證,也可以用于交換信息。有效使用 JWT,可以降低服務(wù)器查詢數(shù)據(jù)庫(kù)的次數(shù)。

    (4)JWT 的最大缺點(diǎn)是,由于服務(wù)器不保存 session 狀態(tài),因此無(wú)法在使用過(guò)程中廢止某個(gè) token,或者更改 token 的權(quán)限。也就是說(shuō),一旦 JWT 簽發(fā)了,在到期之前就會(huì)始終有效,除非服務(wù)器部署額外的邏輯。

    (5)JWT 本身包含了認(rèn)證信息,一旦泄露,任何人都可以獲得該令牌的所有權(quán)限。為了減少盜用,JWT 的有效期應(yīng)該設(shè)置得比較短。對(duì)于一些比較重要的權(quán)限,使用時(shí)應(yīng)該再次對(duì)用戶進(jìn)行認(rèn)證。

    (6)為了減少盜用,JWT 不應(yīng)該使用 HTTP 協(xié)議明碼傳輸,要使用 HTTPS 協(xié)議傳輸。

    5、功能實(shí)現(xiàn)

    JWT功能組件

    使用composer安裝 JWT 功能組件

    composer?require?lcobucci/jwt?3.3

    封裝JWT工具類(lèi)?

    extend/tools/jwt/Token.php

    ?'http://www.pyg.com',//接收人
    ????????'id'?=>?'3f2g57a92aa',//token的唯一標(biāo)識(shí),這里只是一個(gè)簡(jiǎn)單示例
    ????????'sign'?=>?'pinyougou',//簽名密鑰
    ????????'issuer'?=>?'http://adminapi.pyg.com',//簽發(fā)人
    ????????'expire'?=>?3600*24?//有效期
    ????];
    
    ????//生成token
    ????public?static?function?getToken($user_id){
    
    ????????//簽名對(duì)象
    ????????$signer?=?new?Sha256();
    ????????//獲取當(dāng)前時(shí)間戳
    ????????$time?=?time();
    ????????//設(shè)置簽發(fā)人、接收人、唯一標(biāo)識(shí)、簽發(fā)時(shí)間、立即生效、過(guò)期時(shí)間、用戶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;
    ????}
    
    ????//從請(qǐng)求信息中獲取token令牌
    ????public?static?function?getRequestToken()
    ????{
    ????????if?(empty($_SERVER['HTTP_AUTHORIZATION']))?{
    ????????????return?false;
    ????????}
    
    ????????$header?=?$_SERVER['HTTP_AUTHORIZATION'];
    ????????$method?=?'bearer';
    ????????//去除token中可能存在的bearer標(biāo)識(shí)
    ????????return?trim(str_ireplace($method,?'',?$header));
    ????}
    
    ????//從token中獲取用戶id?(包含token的校驗(yàn))
    ????public?static?function?getUserId($token?=?null)
    ????{
    ????????$user_id?=?null;
    
    ????????$token?=?empty($token)?self::getRequestToken():$token;
    
    ????????if?(!empty($token))?{
    ????????????//為了注銷(xiāo)token?加以下if判斷代碼
    ????????????$delete_token?=?cache('delete_token')??:?[];
    ????????????if(in_array($token,?$delete_token)){
    ????????????????//token已被刪除(注銷(xiāo))
    ????????????????return?$user_id;
    ????????????}
    ????????????$token?=?(new?Parser())->parse((string)?$token);
    ????????????//驗(yàn)證token
    ????????????$data?=?new?ValidationData();
    ????????????$data->setIssuer(self::$_config['issuer']);//驗(yàn)證的簽發(fā)人
    ????????????$data->setAudience(self::$_config['audience']);//驗(yàn)證的接收人
    ????????????$data->setId(self::$_config['id']);//驗(yàn)證token標(biāo)識(shí)
    
    ????????????if?(!$token->validate($data))?{
    ????????????????//token驗(yàn)證失敗
    ????????????????return?$user_id;
    ????????????}
    
    ????????????//驗(yàn)證簽名
    ????????????$signer?=?new?Sha256();
    ????????????if?(!$token->verify($signer,?self::$_config['sign']))?{
    ????????????????//簽名驗(yàn)證失敗
    ????????????????return?$user_id;
    ????????????}
    ????????????//從token中獲取用戶id
    ????????????$user_id?=?$token->getClaim('user_id');
    ????????}
    
    ????????return?$user_id;
    ????}
    }

    修改public/.htaccess文件,通過(guò)apache重寫(xiě),處理HTTP請(qǐng)求中的Authorization字段

    (不處理,php中接收不到HTTP_AUTHORAZATION字段信息)

    RewriteCond?%{HTTP:Authorization}?^(.+)$
    RewriteRule?.*?-?[E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    測(cè)試: application/adminapi/controller/Index.php中index方法

    靜態(tài)調(diào)用封裝的\tools\jwt\Token類(lèi)的getToken方法,傳遞一個(gè)用戶id值,生成token

    靜態(tài)調(diào)用封裝的\tools\jwt\Token類(lèi)的getUserId方法,傳遞一個(gè)token,獲取用戶id值

    訪問(wèn)結(jié)果

    到此這篇關(guān)于PHP實(shí)現(xiàn)JWT的Token登錄認(rèn)證的文章就介紹到這了,希望對(duì)大家的學(xué)習(xí)有所幫助。

    為你推薦
    資訊專(zhuān)欄
    熱門(mén)視頻
    相關(guān)推薦
    PHP中empty()和isset()的區(qū)別介紹 php去掉一維數(shù)組的鍵值的實(shí)例方法 php7安裝mysqli實(shí)例講解 PHP對(duì)接抖音開(kāi)發(fā)平臺(tái)接口的詳細(xì)教程 PHP7中對(duì)十六進(jìn)制字符串處理的問(wèn)題詳解 php生成唯一uid的解決方法詳解 php兩種基本的輸出方及實(shí)例詳解 PHP遍歷數(shù)組的6種方式總結(jié) JS截取字符串的三種方法詳解 Python常用的正則表達(dá)式處理函數(shù)詳解 一文秒懂python正則表達(dá)式常用函數(shù) python正則表達(dá)式語(yǔ)法學(xué)習(xí)筆記 Python&nbsp;垃圾回收機(jī)制詳解 Python實(shí)現(xiàn)城市公交網(wǎng)絡(luò)分析與可視化 Python數(shù)據(jù)分析處理(三)--運(yùn)動(dòng)員信息的分組與聚合 基于Python實(shí)現(xiàn)PDF區(qū)域文本提取工具 詳解python的循環(huán) python實(shí)現(xiàn)新年倒計(jì)時(shí)實(shí)例代碼 Python實(shí)現(xiàn)消消樂(lè)小游戲 學(xué)習(xí)python的while循環(huán)嵌套 php判斷時(shí)間戳是否為今天實(shí)例講解 PHP7 preg_replace出錯(cuò)及解決辦法 五年班的學(xué)習(xí)計(jì)劃怎么寫(xiě) 五年級(jí)的學(xué)習(xí)計(jì)劃 初中新學(xué)期學(xué)習(xí)計(jì)劃怎么寫(xiě) 關(guān)于英語(yǔ)的學(xué)習(xí)計(jì)劃怎么寫(xiě) 怎么寫(xiě)暑假學(xué)習(xí)計(jì)劃書(shū) 4年級(jí)數(shù)學(xué)學(xué)習(xí)計(jì)劃怎么寫(xiě) 后半學(xué)期的學(xué)習(xí)計(jì)劃怎么寫(xiě) 上學(xué)期學(xué)習(xí)計(jì)劃怎么寫(xiě) 五年級(jí)的學(xué)習(xí)計(jì)劃書(shū)怎么寫(xiě) 小學(xué)一年級(jí)學(xué)習(xí)計(jì)劃怎么寫(xiě) 暑假學(xué)習(xí)計(jì)劃表怎么寫(xiě) 八年級(jí)學(xué)習(xí)計(jì)劃怎么寫(xiě) 暑期學(xué)習(xí)計(jì)劃表怎么寫(xiě) 小學(xué)四年級(jí)學(xué)習(xí)計(jì)劃怎么寫(xiě) 一年級(jí)的學(xué)習(xí)計(jì)劃怎么寫(xiě) 小學(xué)生的學(xué)習(xí)計(jì)劃怎么寫(xiě) 工作的學(xué)習(xí)計(jì)劃怎么寫(xiě) 初三學(xué)生學(xué)習(xí)計(jì)劃怎么寫(xiě) 新學(xué)期語(yǔ)文學(xué)習(xí)計(jì)劃怎么寫(xiě)
    Top 国产69精品久久久久9999| 久久久国产精品亚洲一区| 国产精品国产三级专区第1集| 亚洲午夜精品久久久久久浪潮| 国产精品2019| 国产精品三级国产电影| 最新69国产成人精品免费视频动漫| 日韩欧国产精品一区综合无码| 国产精品jizz在线观看网站| **毛片免费观看久久精品| 久久精品国产一区二区三区| 久久婷婷五月综合色精品 | 亚洲精品成人图区| 久久精品无码一区二区三区日韩| 久久无码av亚洲精品色午夜| 嫩草伊人久久精品少妇AV| 久青草中文字幕精品视频| 3atv国产精品视频| 日韩精品无码一区二区三区| 国内精品久久久久久不卡影院| 国产精品区一区二区三| 国产香蕉久久精品综合网| 午夜精品免费在线观看| 99re这里只有精品6| 精品一区二区三区视频| 午夜麻豆国产精品无码| 91精品视频在线| 久久国产精品麻豆映画| 99精品久久精品| 亚洲国产精品成人久久蜜臀 | 亚洲精品国产精品乱码视色| 高清免费久久午夜精品| 国自产精品手机在线视频香蕉| 亚洲视频精品在线观看| 久久青青成人亚洲精品| 91原创国产精品| 中文国产成人精品久久一| 97精品国产91久久久久久| 亚洲精品乱码久久久久久蜜桃不卡| 国产一区二区三区精品视频| 久久免费国产精品|