- 一、JWT定義及其組成
- 二、認證過程
- 三、java代碼實作
單點登入(single sign on),簡稱sso。它的定義是多個應用系統間,隻需要登入一次就可以通路所有互相信任的應用系統。下面介紹用jwt技術如何來實作單點登入。
一、JWT定義及其組成
JWT(JSON WEB TOKEN)是一個非常輕巧的規範,這個規範允許我們使用jwt在用戶端和伺服器之間傳遞安全可靠的資訊。
JWT由3個部分組成,分别是頭部、載荷、簽名。
頭部部分
{
"alg": "HS256",
"typ": "JWT"
}
alg描述的是簽名算法。
載荷部分
{
"iss": "發行者",
"sub": 主題",
"aud": “觀衆”,
"exp":"過期時間",
"iat":"簽發時間"
以下可以添加自定義資料
"userid":"11111",
“realname":"真實姓名",
"email":"",
}
Base64算法是可逆的,不可以在載荷部分儲存使用者密碼等敏感資訊。如果業務需要,也可以采用對稱密鑰加密。
簽名部分
HMACSHA256(Base64(Header) + "." + Base64(Payload), secret)
簽名的目的是用來驗證頭部和載荷是否被非法篡改。
驗簽過程描述:讀取Header部分并Base64解碼,得到簽名算法。根據以上方法算出簽名,如果簽名資訊不一緻,說明是非法的。
二、認證過程
下面我們從一個執行個體來看如何運用JWT機制實作認證:
登入
第一次認證:第一次登入,使用者從浏覽器輸入使用者名/密碼,送出後到伺服器的登入處理的Action層(Login Action);
Login Action調用認證服務進行使用者名密碼認證,如果認證通過,Login Action層調用使用者資訊服務擷取使用者資訊(包括完整的使用者資訊及對應權限資訊);
傳回使用者資訊後,Login Action從配置檔案中擷取Token簽名生成的秘鑰資訊,進行Token的生成;
生成Token的過程中可以調用第三方的JWT Lib生成簽名後的JWT資料;
完成JWT資料簽名後,将其設定到COOKIE對象中,并重定向到首頁,完成登入過程;
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicGcq5iYfBDZwETM4ATY4IGMwkTNxUWO3UTN3UGO5AzY0kjN3MWOtIjdvwVbvNmLn1WaopnLxMWaw9CXvwlOzBHd0hWPsJXdmYDM3YjZkJGNzQDNl1SOhRGOtETMiVWLmJzMy0SZ0gTMlNWYk1DZpV3ZmITPlBXe0ZyPldWYtl2LcdXZpZ3Lc12bj5SZjVjL5h3byBnLxATLn1Wavw1LcpDc0RHaiojIsJye.jpg)
請求認證
基于Token的認證機制會在每一次請求中都帶上完成簽名的Token資訊,這個Token資訊可能在COOKIE 中,也可能在HTTP的Authorization頭中;
用戶端(APP用戶端或浏覽器)通過GET或POST請求通路資源(頁面或調用API);
認證服務作為一個Middleware HOOK 對請求進行攔截,首先在cookie中查找Token資訊,如果沒有找到,則在HTTP Authorization Head中查找;
如果找到Token資訊,則根據配置檔案中的簽名加密秘鑰,調用JWT Lib對Token資訊進行解密和解碼;
完成解碼并驗證簽名通過後,對Token中的exp、nbf、aud等資訊進行驗證;全部通過後,根據擷取的使用者的角色權限資訊,進行對請求的資源的權限邏輯判斷;
如果權限邏輯判斷通過則通過Response對象傳回;否則則傳回HTTP 401;
三、java代碼實作
1、使用者登入:
使用者登入驗證通過後添加以下代碼
String token = JwtUtil().generateToken(userName);
Cookie cookie = new Cookie("autotoken", token);
response.addCookie(cookie);
2、調用http請求
後續的http請求認證都帶上token
3、應用系統認證
編寫一個過濾器,對每一個請求進行解碼認證
String authToken = request.getHeader(this.tokenHeader);
if (jwtTokenUtil.validateToken(authToken) {
}
來源:http://rrd.me/enqP7
作者:君之見
:-D 搜尋微信号(ID:
芋道源碼),可以獲得各種 Java 源碼解析、原理講解、面試題、學習指南。
:-D 并且,回複【
書籍】後,可以領取筆者推薦的各種 Java 從入門到架構的 100 本書籍。
:-D 并且,回複【
技術群】後,可以加入專門讨論 Java、後端、架構的技術群。