最近在做一個app,登錄驗證是用的jwt的token驗證,今天來記錄一下......
我的本次實例操作主要參考了下面資料
https://jwt.io/introduction/
https://blog.csdn.net/jikeehuang/article/details/51488020
https://www.cnblogs.com/ganchuanpu/archive/2017/05/17/6870240.html
https://www.cnblogs.com/xiekeli/p/5607107.html
https://blog.csdn.net/superdog007/article/details/80704234
下面是具體步驟:
1.添加jar包
然后是jwt token的具體實現
三個常量分別是
保存在服務端的密鑰,
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安全性還很不了解......只能先這樣了