JWT+Node實現用戶登陸受權控制

查看本文demo的Github地址

1、前言

目前主流的用戶認證方法有基於token基於session兩種方式。前端


2、基於session


一、用戶輸入其登陸信息node

二、服務器驗證用戶信息,建立一個session並將它存儲在數據庫中git

三、服務器爲用戶建立一個sessionid,並將具備sessionid的cookie保存在瀏覽器中github

四、後續每次請求都帶上具備sessionid的cookie,服務器根據數據庫中存儲的cookie驗證,有效就接受請求web

五、一旦用戶註銷應用,會話將在客戶端和服務端都被銷燬算法


3、基於token的用戶認證(JWT)


一、用戶輸入其登陸信息數據庫

二、服務器驗證用戶信息,並返回已簽名的tokenjson

三、token存儲在瀏覽器,例如cookie中後端

四、後續每次請求都帶上cookie中的token瀏覽器

五、服務器解碼JWT,若是令牌有效,則接受請求

六、一旦用戶註銷應用,cookie只在瀏覽器被銷燬,服務器就不保存任何 session 數據了,也就是說,服務器不保存任何會話數據,即服務器變爲無狀態,使其更容易擴展。


4、非對稱加密算法和對稱加密算法

瀏覽器向服務器發送用戶名和密碼時,須要對密碼進行加密,保證密碼不被泄露。什麼是算法,你就能夠理解成爲是一種規則吧,這種規則能夠將信息從一種形式轉變成另外一種形式。

一、對稱加密算法

對稱加密算法是應用較早的加密算法,技術成熟。在對稱加密算法中,數據發送方明文(原始數據)加密密鑰一塊兒通過特殊加密算法處理後,使其變成複雜的加密密文發送出去。接收方收到密文後,若想解讀原文,則須要使用加密用過的密鑰相同算法的逆算法對密文進行解密,才能使其恢復成可讀明文。在對稱加密算法中,使用的密鑰只有一個,發收信雙方都使用這個密鑰對數據進行加密和解密,這就要求解密方事先必須知道加密密鑰。

明文 <-> 密鑰 <-> 密文

二、非對稱加密算法

公開密鑰加密,也稱爲非對稱加密,一種密碼學算法類型,在這種密碼學方法中,須要一對密鑰,一個是私人密鑰(私鑰),另外一個則是公開密鑰(公鑰)。某用戶密鑰加密後所得的信息,只能用該用戶的解密密鑰才能解密。若是知道了其中一個,並不能計算出另一個。所以若是公開了一對密鑰中的一個,並不會危害到另一個的祕密性質。稱公開的密鑰爲公鑰;不公開的密鑰爲私鑰。

明文 + 公鑰 -> 密文 -> 密文 + 私鑰 = 明文


所以,非對稱加密是一種比對稱加密更加優秀的加密算法,固然算法有利有弊,對稱加密速度快可是安全性相對於非對稱加密來講低,爲何呢,你想啊,要想使用對稱加密,那麼分享信息的各個個體之間都須要分享這個密鑰,好比大家1000我的之間都使用同一個密鑰進行密文傳輸,只要其中一我的密鑰被盜竊了,那麼總體加密的信息將都被破解了。

5、解決方案

項目中在用戶登陸時須要進行用戶名和密碼加密,這裏選用了RSA非對稱加密的方式.

  • 公鑰私鑰:OpenSSL的公鑰私鑰(Node crypto模塊限制)
  • 前端: jsencrypt庫加密
  • 後端: Node crypto模塊


6、使用OpenSSL生成公鑰私鑰

一、打開Terminal--cd 到指定文件夾MyCert

二、終端輸入openssl


三、生成私鑰


四、把RSA私鑰轉換成PKCS8格式。若是提示輸入密碼,密碼爲空(直接回車)就行;


五、生成公鑰


六、 已經在myCert文件夾生成私鑰公鑰文件



7、前端使用jsencrypt庫加密

此文章的demo點擊這裏


以上代碼作的就是 用戶密碼 + 公鑰(鹽) = 密文 的過程(公鑰用來加密,私鑰用來解密)PUB_KEY就是在第一步openssl生成的公鑰文件myCert/rsa_public_key.pem文件,直接複製拷貝過來用


8、使用Node的crypto模塊解密


注意:

(1) fs.readFileSync()來讀取私鑰文件

(2) 使用用戶的信息(除了密碼)來生成token,密碼只用來向數據庫或後端微服務查詢用戶信息

9、JWT(jsonwebtoken)生成令牌token


注意: JWT_SECRET能夠是一個自定義的字符串用來給加密算法「加鹽」用


這樣以後咱們就成功生成了token並保存在瀏覽器的cookie中了

10、封裝tokenMiddleWare來校驗token

每當瀏覽器發起請求到node層的路由中間件處理業務以前,都須要先對請求攜帶的token作校驗,經過則執行對應的業務邏輯



附:cleanToken方法用來作退出登陸操做,清除瀏覽器token令牌
相關文章
相關標籤/搜索