通過 Spring Cloud Security OAuth2 的測試我們發現,當資源服務和授權服務不在壹起時資源服務使用RemoteTokenServices遠程請求授權服務譚政token,如果訪問量大將會影響系統的性能。
為了解決上面的問題,可以采用JWT格式即可解決,用戶認證通過後會得到壹個JWT令牌,JWT令牌中已經包含了用戶相關的信息,客戶端只需要哦攜帶JWT訪問資源服務,資源服務根據事先約定的算法自行完成令牌校驗,無需每次都請求認證服務完成校驗。
1、什麽是JWT?
JSON Web Token(JWT)是壹個開放的行業標準(RFC 7519),它定義了壹種簡介的、自包含的協議格式,用於在通信雙方傳遞json對象,傳遞的信息經過數字簽名可以被驗證和信任。JWT可以使用HMAC算法或者RSA的公鑰/私鑰對簽名,防止被篡改。
JWT官網 、 JWT標準
JWT令牌的優點:
1)jwt基於json,非常方便解析。
2)可以在令牌中自定義豐富的內容,易擴展。
3)通過非對稱加密算法及數字簽名技術,JWT防止篡改,安全性高。
4)資源服務使用JWT可不依賴認證服務即可完成校驗授權。
JWT令牌的缺點:
1)JWT令牌較長,占存儲空間比較大。
2、JWT令牌結構
通過學習JWT令牌結構為自定義JWT令牌打好基礎。
JWT令牌由三部分( Header、Payload、Signature )組成,每部分中間使用點(.)分隔,比如:xxxx.yyyy.zzzz( eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.cThIIoDvwdueQB468K5xDc5633seEFoqwxjF_xSJyQQ )。
1) Header
頭部包括令牌的類型(即JWT)及使用的哈希算法(如HMACSHA256或RSA),下邊是Header部分的內容:
2) Payload
第二部分是負載,內容也是壹個json對象,它是存放有效信息的地方,它可以存放jwt提供的現成字段,比如:iss(簽發者)、exp(過期時間戳)、sub(面向的用戶)等,也可自定義字段。此部分不建議存放敏感信息,因為此部分可以解碼還原原始內容。將第二部分負載使用Base64Url編碼,得到壹個字符串就是JWT令牌的第二部分。
3) Signature
第三部分是簽名,此部分用於防止jwt內容被篡改。這個部分使用Base64Url將前面兩部分進行編碼,編碼後使用點(.)連接組成字符串,最後使用Header中聲明的簽名算法進行簽名。
base64UrlEncode(header):jwt令牌的第壹部分Header。
base64UrlEncode(payload):jwt令牌的第二部分Payload。
your-256-bit-secret:簽名所使用的的秘鑰。
在UAA中配置jwt令牌服務,即可實現生成jwt格式的令牌。
1、TokenConfig
2、定義JWT令牌服務 AuthorizationServer
資源服務需要和授權服務擁有壹致的簽名、令牌服務等:
1、將授權服務中的TokenConfig類拷貝到資源服務項目中。
2、屏蔽掉資源服務中原來的令牌服務類,不再使用HTTP的方式調用授權服務來校驗JWT令牌。