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