最近在作一個app,登陸驗證是用的jwt的token驗證,今天來記錄一下......html
個人本次實例操做主要參考了下面資料redis
https://jwt.io/introduction/數據庫
https://blog.csdn.net/jikeehuang/article/details/51488020安全
https://www.cnblogs.com/ganchuanpu/archive/2017/05/17/6870240.htmlapp
https://www.cnblogs.com/xiekeli/p/5607107.html編碼
https://blog.csdn.net/superdog007/article/details/80704234加密
下面是具體步驟:.net
1.添加jar包3d
而後是jwt token的具體實現jwt
三個常量分別是
保存在服務端的密鑰,
jwt令牌的有效時間
刷新令牌的有效時間
jwt內置了許多加密編碼,我這裏採用Hs256加密,將本身設定的特有密碼進行base編碼,生成一個key
這一段是生成一個usertoken,
jwt token包含三部分 分別是header,payload(載荷),sign(簽名)
header用來設置本身token的類型和使用的編碼,payload存放用戶的安全信息,由於jwt提供的編碼是可逆的,因此不要存放用戶的關鍵信息
sign是token的一個簽名,由headr,payload以及key決定,當客戶端發來一個key的時候,只要校驗簽名是否正確便可
這一段代碼和上一張圖在同一個方法內,主要用於實現令牌的刷新,原本刷新時間應該存放在redis裏,可是我條件有限,只能先存放在數據庫中
token的校驗從傳來的token中得到載荷payload,從新生成一個token,拿到新token的簽名sign,將新的sign和舊sign比較,當兩個sign一致時則經過驗證
這一段代碼和上一段在同一個方法內,當連個sign不一致時說明客戶端token被篡改,直接返回一個null,在攔截器中作判斷當爲null時直接回到登錄界面
當t oken過時 ExpiredJwtException e 會自動捕獲,咱們在捕獲到這個異常時,進行令牌的刷新,而後返回這個新的令牌
兩個sign一致就直接返回原先的token。
令牌的刷新將以前存放在數據中刷新有效時間取出,與當前時間進行比較,若是小於當前的刷新有效時間則刷新令牌,而後更新數據庫,返回新的token字符串,
若是該用戶連已經長時間未使用app,致使當前時間已經超過了令牌刷新的時間,則刪除數據庫中的對應數據,token返回null;
客戶端的token是放在request的header中發到後臺的,因此須要從heaer中取出
拿到的token是這樣子的,因此須要對這個字符串按照空格截取,拿到真正有用的token
咱們拿到校驗返回過來的字符串,當這個字符串爲空時,客戶端返回到登錄界面
當兩個token不相等時,說明校驗傳回來的token是新的,那麼咱們修改響應頭中token爲新的token,而後程序繼續執行
........
第一次使用jwt,對jwt安全性還很不瞭解......只能先這樣了