Restful下的token認證方案


 Restful講究一個無狀態的特性(stateless),這就不能把一些例如登陸后的認證信息寫進cookie的傳統方式,

目前探索的是采用token的方式來進行權限的識別。

剛開始研究token的時候,很容易查到比較流行的JWT(JSON Web Token)的很多資料,目前有RFC的規范(盡管還只是個草案)。

簡單來說JWT規定了可以自定義的CLAIM區域,並且可以加密(要在頭部指明加密方法),如下圖所示

(本圖來自於https://jwt.io)

由於采用的非對稱加密的方式,所以一般情況下信息還是比較安全的(有人對於header里邊標明了加密算法而有些擔憂,提出改進的是只是標明自定義算法type例如"alg:1")。

JWT的優勢顯而易見,這樣認證過的一些信息就可以放入其中,並且下次用戶再次訪問的時候,只需要將JWT返回就好,服務器根據解密JWT的內容來獲取一些認證信息,並且可以在JWT里設定過期的時間,用於識別登陸時效性。

但是如果用於用戶登陸認證方面,就必須滿足用戶主動logout的情況,但是由於這些認證后的信息都保存在JWT里,所以有一種建議是將JWT里邊的過期時間設置的較短,每次成功訪問后刷新過期時間,一旦過期也就理解為logout了。這種做法,並不滿足logout的

動作,所以更常用的一種做法就是將JWT生成后保存在數據庫中例如保存在redis中,並由redis設定過期時間。

分析到此,發現JWT還是要保存在數據庫中,而且其認證后的信息某種意義上來說雖然加密了,但是還是暴露在public當中,這一點讓我總感覺不舒服。

於是,一個新的方案產生了,既然逃不出要利用數據庫,那么就將認證后的信息保存在數據庫中(例如redis),返回給用戶的token就是為了識別唯一性,當用戶成功認證后將獲得一個token,這個token並不包含任何信息,只是為了用戶下次再次訪問的時候,后台能夠在數據庫中查詢到相關信息。

(之所以用redis,考慮到其讀取K-V的速度和命中率都很不錯)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM