一、什么是認證
好多人不知道什么是認證,認證,其實就是服務端確認用戶身份。Http協議是無狀態的,客戶端發送一條請求,服務端返回一條響應,二者就算做成一單買賣,一拍兩散。在很久以前,互聯網所能提供的服務僅僅是一些頁面的瀏覽,服務器並不需要知道是誰在訪問自己,而隨着互聯網的發展,在很多應用場景記住用戶的登錄狀態,比如購物網站,服務器需要知道具體是什么人買了哪些商品,這個時候,就有了登錄認證這個需求,目的就是為了確認發起請求的客戶端的身份。
二、認證的方式
認證服務的方式主要有兩種,一種是有狀態的,一種是無狀態的。
2.1什么是有狀態?
有狀態服務,即服務端需要記錄每次會話的客戶端信息,從而識別客戶端身份,根據用戶身份進行請求的處理,典型的設計如tomcat中的session。
例如登錄:用戶登錄后,我們把登錄者的信息保存在服務端session中,並且給用戶一個cookie值,記錄對應的session。然后下次請求,用戶攜帶cookie值來,我們就能識別到對應session,從而找到用戶的信息。
缺點:
- 服務端保存大量數據,增加服務端壓力
- 服務端保存用戶狀態,無法進行水平擴展
- 客戶端請求依賴服務端,多次請求必須訪問同一台服務器
2.2什么是無狀態?
微服務集群中的每個服務,對外提供的都是Rest風格的接口。而Rest風格的一個最重要的規范就是:服務的無狀態性,即:
- 服務端不保存任何客戶端請求者信息
- 客戶端的每次請求必須具備自描述信息,通過這些信息識別客戶端身份
優點:
- 客戶端請求不依賴服務端的信息,任何多次請求不需要必須訪問到同一台服務
- 服務端的集群和狀態對客戶端透明
- 服務端可以任意的遷移和伸縮
- 減小服務端存儲壓力
2.3如何實現無狀態?
無狀態登錄的流程:
- 當客戶端第一次請求服務時,服務端對用戶進行信息認證(登錄)
- 認證通過,將用戶信息進行加密形成token,返回給客戶端,作為登錄憑證
- 以后每次請求,客戶端都攜帶認證的token
- 服務的對token進行解密,判斷是否有效。
流程圖:
token是識別客戶端身份的唯一標示,整個登錄過程中,最重要的就是要保證token的安全性。
三、JWT介紹
JWT,全稱是Json Web Token, 是JSON風格輕量級的授權和身份認證規范,可實現無狀態、分布式的Web應用授權。
3.1JWT數據格式:
-
Header:頭部,通常頭部有兩部分信息:
- 聲明類型,這里是JWT
- 簽名算法,自定義
我們會對頭部進行base64加密(可解密),得到第一部分數據
-
Payload:載荷,就是有效數據,一般包含下面信息:
- 用戶身份信息(注意,這里因為采用base64加密,可解密,因此不要存放敏感信息)
- tokenID:當前這個JWT的唯一標示
- 注冊聲明:如token的簽發時間,過期時間,簽發人等
這部分也會采用base64加密,得到第二部分數據
-
Signature:簽名,是整個數據的認證信息。一般根據前兩步的數據,再加上服務的的密鑰(secret)(不要泄漏,最好周期性更換),通過加密算法生成。用於驗證整個數據完整和可靠
3.2JWT 的交互流程
流程圖:
- 授權流程:
- 1、用戶請求登錄,攜帶用戶名密碼到授權中心
- 2、授權中心攜帶用戶名密碼,到用戶中心查詢用戶
- 3、查詢如果正確,生成JWT憑證
- 4、返回JWT給用戶
- 鑒權流程:
- 1、用戶請求某微服務功能,攜帶JWT
- 2、微服務將jwt交給授權中心校驗
- 3、授權中心返回校驗結果到微服務
- 4、微服務判斷校驗結果,成功或失敗
- 5、失敗則直接返回401
- 6、成功則處理業務並返回