閱讀文本大概需要3分鐘。
單點登入(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對象中,并重定向到首頁,完成登入過程;

請求認證
基于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、使用者登入:
使用者登入驗證通過後添加以下代碼
Stringtoken =JwtUtil().generateToken(userName);
Cookiecookie =newCookie("autotoken", token);
response.addCookie(cookie);
2、調用http請求
後續的http請求認證都帶上token
3、應用系統認證
編寫一個過濾器,對每一個請求進行解碼認證
StringauthToken = request.getHeader(this.tokenHeader);
if(jwtTokenUtil.validateToken(authToken) {
//認證通過
}
關注我
每天進步一點點
很幹!在看嗎?
☟