Jwt建立身份令牌Token

皮蛋小粥發表於2017-12-09
                      
     最近再做一個的個人社群,首先就是解決登陸的問題。
     根據最近的學習和網上看的資料,來做一下安全登入(純口述,程式碼後面附上)。
     前端使用AngularJS,對於使用者的密碼是用RSA非對稱加密方式進行加密,對於RSA我最直白的印象就是
:沒有祕鑰的情況暴力破解可能性為0,相對RSA有深入瞭解的的可以自行百度。在我專案中就是前端傳送
請求的密碼進行RSA加密,服務端通過祕鑰進行解密,同資料庫中的密碼進行匹配,同時我的資料看中儲存
的密碼也是用MD5碼進行編碼的非明文儲存,為什麼這麼做,因為是供自己學習的專案,就多多實驗一些東西,
有不合理的地方還請指出。
當使用者匹配成功之後,我們會返回一個Token,我是如何理解Token的:當我們登入成功之後,為防避免下一次
再進行一次身份匹配的工作,我們將登入的資訊儲存到Token中,返回給前端,在使用者每次傳送請求的時候,
其請求頭都會帶著該Token,服務端在攔截器中對Token進行驗證,合法即放行。在瞭解Token的過程中我遇到
一些問題或者說發現一些問題:
單點登入:使用者登入的情況下,在另一個瀏覽器或者機器登入會獲取到一個新的Token,此時之前的Token在沒有
失效的情況下也應該失效,從而擠掉上一臺電腦的賬號。我最初想的是新使用者登入的時候,獲取上一次儲存在資料
庫中的token,然後setExpiration方法來使其過期,但是實驗過程中我發現,通過String型別解密成Claims類(jjwt maven 搜一下
然後將依賴加入到maven中,可以研究一下這些類以及如何生成Token)的時候
雖然可以setExpiration,但是其Token仍然是可用的,直到你在建立的時候設定的過期時間到了才會失效。只有你在JwtBuilder物件
裡面setExpiration才是真正有效的,想過吧物件儲存起來,但是jar中的類沒有序列化,所以各種操作都失敗了,最終我只能這樣解決:
客戶每一次傳送請求的時候,Token都和資料庫中的token進行一次比較,相同則說明沒有在其他地方登入,不相同則說明有新的token生成
也就是有在其他地方登陸,強制下線,阻斷請求。但是由於進行資料庫查詢操作,我總感覺很不爽。。。。但是目前我沒有別的辦法,歡迎
留言指導。
 安全的問題,我想的是,如果請求頭被擷取,那麼跨站偽造請求怎麼處理。雖然我所瞭解的,如果請求頭都被獲取了,說明使用者電腦安全存在問題
 基本上是無解(受個人知識所限,有問題多多指教,後面就不在重複這句話了,哈哈),我還是想到一個方案但是被自己推翻了,就是每次請求
 都重新整理token,當使用者token被截獲,那麼重新整理出的token會使上一個token失效,進而告知使用者修改密碼或者其他挽回措施,但是我想了想有問題,
 如果使用者沒有獲取到修改密碼的通知,或者不能及時獲取,黑客不斷的重新整理token,那理論上這段時間裡面他可以一直登陸,一直操作,直到
 使用者收到通知,所以權衡一下,還是設定過期時間,過期重新登陸比較穩定一點,沒有太多其他因素干擾。
 
 
      

相關文章