JWT(Json Web Token)是一個開放的數據交換驗證標準rfc7519(https://tools.ietf.org/html/r...,通常用來作輕量級的API鑑權。因爲許多API接口設計是遵循無狀態的(好比Restful),因此JWT是Cookie Session這一套機制的替代方案。php
JWT由三部分組成頭部(header)、載荷(payload)、簽名(signature)。頭部定義類型和加密方式;載荷部分放不是很重要的數據;簽名使用定義的加密方式加密base64後的header和payload和一段你本身的加密key。最後的token由base64(header).base64(payload).base64(signatrue)組成。html
平時須要鑑權的接口須要傳這個token,能夠post字段提交,可是通常建議放在header頭中 ,由於JWT通常配合https使用,這樣就萬無一失。前端
首先token是服務端簽發,而後驗證時是用一樣加密方式把header、payload和key再加密遍 而後看是否是和簽名一致 若是不一致就說明token是非法的 這裏主要靠的是加密(好比HS256)難以被攻破 至少目前吧 另外不得不說這裏的加密對服務器來講是一個開銷 這也是JWT的缺點laravel
我很早就據說過JWT 但那時候還沒用上 感受近幾年先後端分離思想加速了JWT的使用 MVC前置到前端(VUE、REACT)後端只用提供API API強調無狀態 天然而然使用了JWT這套方案git
以前作小程序時 沒有絕對使用JWT這套方案 我把它簡化了下github
最近開發的一套項目用的是Laravel作後端提供API服務,因此天然而然使用了JWT,使用的擴展是tymon/jwt-auth 關於這套擴展機制的具體使用能夠參考這篇文章 寫的很不錯:https://laravel-china.org/art...redis
JWT有三個時間概念: 過時時間 寬限時間 刷新時間小程序
上面那文章說token過了過時時間是不可刷新的,但實際上是能夠刷新的,我這邊使用時能夠(開啓了黑名單機制和1min寬限時間) 可是過了刷新時間不能刷新這是確定的後端
能夠借用laravel的中間件實現自動刷新 服務端判斷過時了可是在刷新時間內主動刷新一次 並把新的token在Header頭中返回給客戶端緩存
我感受定義刷新時間(好比一個月) + 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...