什么是JWT?
JWT(Json Web Token)是一個開放的數據交換驗證標准rfc7519(php 后端實現JWT認證方法一般用來做輕量級的API鑒權。由於許多API接口設計是遵循無狀態的(比如Restful),所以JWT是Cookie Session這一套機制的替代方案。
組成
JWT由三部分組成頭部(header)、載荷(payload)、簽名(signature)。頭部定義類型和加密方式;載荷部分放不是很重要的數據;簽名使用定義的加密方式加密base64后的header和payload和一段你自己的加密key。最后的token由base64(header).base64(payload).base64(signatrue)組成。
使用方式
平時需要鑒權的接口需要傳這個token,可以post字段提交,但是一般建議放在header頭中 ,因為JWT一般配合https使用,這樣就萬無一失。
為什么安全?
首先token是服務端簽發,然后驗證時是用同樣加密方式把header、payload和key再加密遍 然后看是不是和簽名一致 如果不一致就說明token是非法的 這里主要靠的是加密(比如HS256)難以被攻破 至少目前吧 另外不得不說這里的加密對服務器來說是一個開銷 這也是JWT的缺點
使用
我很早就聽說過JWT 但那時候還沒用上 感覺近幾年前后端分離思想加速了JWT的使用 MVC前置到前端(VUE、REACT)后端只用提供API API強調無狀態 自然而然使用了JWT這套方案
之前做小程序時 沒有絕對使用JWT這套方案 我把它簡化了下
最近開發的一套項目用的是Laravel做后端提供API服務,所以自然而然使用了JWT,使用的擴展是tymon/jwt-auth 關於這套擴展機制的具體使用可以參考這篇文章 寫的很不錯:https://laravel-china.org/art...
項目使用時的具體細節
JWT三個時間概念
JWT有三個時間概念: 過期時間 寬限時間 刷新時間
上面那文章說token過了過期時間是不可刷新的,但其實是可以刷新的,我這邊使用時可以(開啟了黑名單機制和1min寬限時間) 但是過了刷新時間不能刷新這是肯定的
token刷新
可以借用laravel的中間件實現自動刷新 服務端判斷過期了但是在刷新時間內主動刷新一次 並把新的token在Header頭中返回給客戶端
記住我功能
我感覺定義刷新時間(比如一個月) + token自動刷新機制這一套就是記住我功能
不能主動銷毀Token
默認JWT這套方案好像不可以主動剔除用戶的,因為服務端不會存token,只是驗證。這和session不一樣。 但是我感覺可以借用黑名單機制 來判斷 中間件中判斷該token在剔除黑名單中就銷毀token並返回鑒權失敗
單點登錄
結合緩存比如redis存客戶端標識是可以的
多套用戶權限機制
比如客戶端有用戶端和商家端兩套用戶機制(不同表),可以在auth.php定義兩個guard 分別指定對應的model Login邏輯單獨寫 比如auth('userApi') auth('corpApi') 可以拿到不同的guard 刷新中間件是可以共用的 不過router中的middleware方法可以指定具體的middleware
為什么不同權限體系的刷新中間件可以公用
感覺是jwt-auth實現了這機制 驗證token時會根據sub字段判斷 我base64decode兩個token的payload后發現sub一個是1 一個是2
如果有問題歡迎指正!
本文最早發布於Rootrl's blog https://rootrl.github.io/2018...