查看本文demo的Github地址
目前主流的用戶認證方法有基於token和基於session兩種方式。前端
一、用戶輸入其登陸信息node
二、服務器驗證用戶信息,建立一個session並將它存儲在數據庫中git
三、服務器爲用戶建立一個sessionid,並將具備sessionid的cookie保存在瀏覽器中github
四、後續每次請求都帶上具備sessionid的cookie,服務器根據數據庫中存儲的cookie驗證,有效就接受請求web
五、一旦用戶註銷應用,會話將在客戶端和服務端都被銷燬算法
一、用戶輸入其登陸信息數據庫
二、服務器驗證用戶信息,並返回已簽名的tokenjson
三、token存儲在瀏覽器,例如cookie中後端
四、後續每次請求都帶上cookie中的token瀏覽器
五、服務器解碼JWT,若是令牌有效,則接受請求
六、一旦用戶註銷應用,cookie只在瀏覽器被銷燬,服務器就不保存任何 session 數據了,也就是說,服務器不保存任何會話數據,即服務器變爲無狀態,使其更容易擴展。
瀏覽器向服務器發送用戶名和密碼時,須要對密碼進行加密,保證密碼不被泄露。什麼是算法,你就能夠理解成爲是一種規則吧,這種規則能夠將信息從一種形式轉變成另外一種形式。
對稱加密算法是應用較早的加密算法,技術成熟。在對稱加密算法中,數據發送方將明文(原始數據)和加密密鑰一塊兒通過特殊加密算法處理後,使其變成複雜的加密密文發送出去。接收方收到密文後,若想解讀原文,則須要使用加密用過的密鑰及相同算法的逆算法對密文進行解密,才能使其恢復成可讀明文。在對稱加密算法中,使用的密鑰只有一個,發收信雙方都使用這個密鑰對數據進行加密和解密,這就要求解密方事先必須知道加密密鑰。
明文 <-> 密鑰 <-> 密文
公開密鑰加密,也稱爲非對稱加密,一種密碼學算法類型,在這種密碼學方法中,須要一對密鑰,一個是私人密鑰(私鑰),另外一個則是公開密鑰(公鑰)。某用戶密鑰加密後所得的信息,只能用該用戶的解密密鑰才能解密。若是知道了其中一個,並不能計算出另一個。所以若是公開了一對密鑰中的一個,並不會危害到另一個的祕密性質。稱公開的密鑰爲公鑰;不公開的密鑰爲私鑰。
明文 + 公鑰 -> 密文 -> 密文 + 私鑰 = 明文
所以,非對稱加密是一種比對稱加密更加優秀的加密算法,固然算法有利有弊,對稱加密速度快可是安全性相對於非對稱加密來講低,爲何呢,你想啊,要想使用對稱加密,那麼分享信息的各個個體之間都須要分享這個密鑰,好比大家1000我的之間都使用同一個密鑰進行密文傳輸,只要其中一我的密鑰被盜竊了,那麼總體加密的信息將都被破解了。
項目中在用戶登陸時須要進行用戶名和密碼加密,這裏選用了RSA非對稱加密的方式.
此文章的demo點擊這裏
以上代碼作的就是 用戶密碼 + 公鑰(鹽) = 密文 的過程(公鑰用來加密,私鑰用來解密)PUB_KEY就是在第一步openssl生成的公鑰文件myCert/rsa_public_key.pem文件,直接複製拷貝過來用
注意:
(1) fs.readFileSync()來讀取私鑰文件
(2) 使用用戶的信息(除了密碼)來生成token,密碼只用來向數據庫或後端微服務查詢用戶信息
注意: JWT_SECRET能夠是一個自定義的字符串用來給加密算法「加鹽」用
這樣以後咱們就成功生成了token並保存在瀏覽器的cookie中了
每當瀏覽器發起請求到node層的路由中間件處理業務以前,都須要先對請求攜帶的token作校驗,經過則執行對應的業務邏輯
附:cleanToken方法用來作退出登陸操做,清除瀏覽器token令牌