天天看點

java jwt 單點登入_jwt技術實作系統間的單點登入

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

java jwt 單點登入_jwt技術實作系統間的單點登入

請求認證

java jwt 單點登入_jwt技術實作系統間的單點登入

基于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) {

//認證通過

}

關注我

每天進步一點點

很幹!在看嗎?