php中關(guān)于token驗(yàn)證的相關(guān)問(wèn)題詳解
token驗(yàn)證
什么是token?我相信很多開(kāi)發(fā)者都或多或少聽(tīng)過(guò)基于 token 的用戶鑒權(quán)和基于 session 的用戶鑒權(quán),而今天說(shuō)的 token 驗(yàn)證就是第一種了。token 的意思是“令牌”,是用戶第一次登錄服務(wù)器返回的,它能讓用戶不需要提交賬戶和密碼就能進(jìn)行服務(wù)器驗(yàn)證身份,它是被放在請(qǐng)求頭中一起提交給服務(wù)器的。
為什么用 token 驗(yàn)證?怎么用 token 驗(yàn)證?現(xiàn)在簡(jiǎn)單介紹一下,有錯(cuò)誤請(qǐng)大牛指出,我會(huì)立即更正!
首先是為什么用?
為了驗(yàn)證用戶的登錄情況,畢竟不是登錄狀態(tài)的話很多東西是不允許訪問(wèn)和呈現(xiàn)出來(lái)的。 減少數(shù)據(jù)庫(kù)的頻繁查詢,增加服務(wù)器性能,使得服務(wù)器更加健壯。 它可以在多個(gè)服務(wù)間共享,完全由應(yīng)用管理,可以避開(kāi)瀏覽器的同源策略。 增加擴(kuò)展性、安全性和減少服務(wù)器內(nèi)存開(kāi)銷(xiāo)。傳統(tǒng)的服務(wù)器驗(yàn)證是使用 cookie + session 驗(yàn)證,服務(wù)器需要每一次都驗(yàn)證客戶端的請(qǐng)求去辨別客戶端身份,并且還要?jiǎng)?chuàng)建一個(gè)記錄將用戶信息存儲(chǔ)起來(lái),然而隨著現(xiàn)在科技發(fā)達(dá),這種驗(yàn)證弊端也就顯露出來(lái)了,例如用戶增多從而引發(fā)內(nèi)存資源消耗變大、CORS(跨域資源共享)和 CSRF(跨域請(qǐng)求偽造)等。
那么怎么用呢?
流程: 客戶端的用戶輸入賬戶密碼請(qǐng)求登錄。 服務(wù)端收到請(qǐng)求并進(jìn)行驗(yàn)證,成功則生成一個(gè) token 值并返回給客戶端。 客戶端收到 token 值并將其存儲(chǔ),例如 本地存儲(chǔ):localStore 或 放在Cookie。 客戶端每次請(qǐng)求都將 token 值放在請(qǐng)求頭中發(fā)給服務(wù)器,服務(wù)器進(jìn)行驗(yàn)證有效性。 成功則返回客戶端請(qǐng)求的數(shù)據(jù),失敗可以讓用戶進(jìn)行登錄重新獲取新的 token 值。
token的組成
一般 token 組成:
Uid(用戶身份的唯一標(biāo)識(shí)) time(時(shí)間戳) sign(簽名)
JWT 組成:
JWT(JSON Web Tokens) 讀:jot
標(biāo)準(zhǔn)的組成:
header(頭部),參數(shù)主要包括:類(lèi)型--JWT,簽名的算法--HS256。
private static $header=array( 'alg'=>'HS256', //生成signature的算法 'typ'=>'JWT' //類(lèi)型 );
poyload(負(fù)荷):一般是自己想要放置的數(shù)據(jù)(因?yàn)樾畔?huì)暴露,不建議放敏感信息)。
$time = time(); $tokenInfo = [ 'iss'=>'CIMS', 'iat'=>$time, 'nbf'=>$time+2, 'jti'=>md5(uniqid('JWT').$time), 'sub'=>$data, 'exp'=> $time+7200 ];
sign(簽名):為了防止被惡意篡改數(shù)據(jù)。
/** * HMACSHA256簽名 https://jwt.io/ 中HMACSHA256簽名實(shí)現(xiàn) * @param string $input 為base64編碼后連接而成的的header和poyload的字符串:base64UrlEncode(header).".".base64UrlEncode(tokenInfo) * @param string $key * @param string $alg 算法方式 * @return mixed */ private static function signature(string $input, string $key, string $alg = 'HS256') { $alg_config=array( 'HS256'=>'sha256' ); return self::base64UrlEncode(hash_hmac($alg_config[$alg], $input, $key,true)); }
結(jié)果:一般會(huì)使用 base64 編碼,中間用.隔開(kāi)
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsIm5hbWUiOiJjZXNoaSIsImF1ZCI6IiIsImV4cCI6MTY4MTIyNDY0OCwiaWF0IjoxNjgxMjIxMDQ4LCJpc3MiOiIiLCJqdGkiOiJkN2UxYTBiNGU3MDZmODUxMjgzZWZkZWVlZjQ5MWEwOSIsIm5iZiI6MTY4MTIyMTA0OCwic3ViIjoiIn0.qRTyO1pYHHJxBNRwHUz032NWKKqS3C9dakOHASJyASk
總結(jié)
擴(kuò)展
放請(qǐng)求頭:
JWT 缺點(diǎn):1.簽發(fā)生成后無(wú)法修改。2.不包含權(quán)限控制。
解決token 注銷(xiāo)問(wèn)題:盡快讓 token 失效,退出登錄后刪除 cookie,對(duì)失效的 token 形成黑名單,會(huì)違無(wú)狀態(tài)特性,但是標(biāo)記時(shí)間短,會(huì)減少服務(wù)器壓力。
解決token 續(xù)簽問(wèn)題:后端在用戶登錄的接口添加 token 有效期判斷:例如即將過(guò)期那就重新生成一個(gè)返回。
token驗(yàn)證目前是非常流行的,不僅僅只是在web網(wǎng)站上,移動(dòng)端、小程序也會(huì)用到。例如小程序用的是使用 login 獲取 code 發(fā)送給后端進(jìn)行一系列使用微信官方API接口獲取數(shù)據(jù)再進(jìn)行加密等操作才返回 token,這里就不詳細(xì)展開(kāi)了吧,有興趣哈哈哈哈自己查下看看啦。
到此這篇關(guān)于php中關(guān)于token驗(yàn)證的相關(guān)問(wèn)題詳解的文章就介紹到這了,更多相關(guān)php token驗(yàn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- thinkphp5框架API token身份驗(yàn)證功能示例
- php版微信開(kāi)發(fā)Token驗(yàn)證失敗或請(qǐng)求URL超時(shí)問(wèn)題的解決方法
- PHP token驗(yàn)證生成原理實(shí)例分析
- PHP實(shí)現(xiàn)微信公眾號(hào)驗(yàn)證Token的示例代碼
- php token使用與驗(yàn)證示例【測(cè)試可用】
- PHP實(shí)現(xiàn)防止表單重復(fù)提交功能【基于token驗(yàn)證】
- 詳解php curl帶有csrf-token驗(yàn)證模擬提交方法
- Thinkphp5 微信公眾號(hào)token驗(yàn)證不成功的原因及解決方法
- 關(guān)于php微信訂閱號(hào)開(kāi)發(fā)之token驗(yàn)證后自動(dòng)發(fā)送消息給訂閱號(hào)但是沒(méi)有消息返回的問(wèn)題
- 驗(yàn)證token、回復(fù)圖文\文本、推送消息的實(shí)用微信類(lèi)php代碼
相關(guān)文章
php批量刪除cookie的簡(jiǎn)單實(shí)現(xiàn)方法
這篇文章主要介紹了php批量刪除cookie的簡(jiǎn)單實(shí)現(xiàn)方法,實(shí)例分析了刪除單個(gè)cookie及數(shù)組遍歷的方式批量刪除cookie的技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2015-01-01php簡(jiǎn)單實(shí)現(xiàn)批量上傳圖片的方法
這篇文章主要介紹了php簡(jiǎn)單實(shí)現(xiàn)批量上傳圖片的方法,實(shí)例分析了php文件傳輸?shù)膶?shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-05-05解析web文件操作常見(jiàn)安全漏洞(目錄、文件名檢測(cè)漏洞)
本篇文章是對(duì)web文件操作常見(jiàn)安全漏洞(目錄、文件名檢測(cè)漏洞)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06PHP實(shí)現(xiàn)的用戶注冊(cè)表單驗(yàn)證功能簡(jiǎn)單示例
這篇文章主要介紹了PHP實(shí)現(xiàn)的用戶注冊(cè)表單驗(yàn)證功能,結(jié)合簡(jiǎn)單實(shí)例形式分析了php form表單提交、數(shù)據(jù)庫(kù)查詢、正則驗(yàn)證等相關(guān)操作技巧,需要的朋友可以參考下2019-02-02