日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
忙里偷閑又把自己的JWT實(shí)現(xiàn)改進(jìn)了一下

之前在Spring Security 實(shí)戰(zhàn)干貨系列中我使用了 Spring 官方提供的spring-security-jwt作為JWT的實(shí)現(xiàn)。目前該工具包已經(jīng)不再維護(hù),而且對(duì)于最新推出的Spring Security OAuth2 Client 和 Spring Authorization Server都不是特別的兼容。所以抽了兩天時(shí)間結(jié)合這兩個(gè)新依賴重新實(shí)現(xiàn)了 JWT。

Nimbus 庫(kù)

在目前最新的Spring Security中默認(rèn)使用了Nimbus的 JOSE 庫(kù)nimbus-jose-jwt。這個(gè)庫(kù)目前是 JOSE 最常用的類庫(kù)之一,大部分的改造工作都是圍繞這個(gè)庫(kù)開展的。

改造的過程分享

流程上跟 Spring Security 實(shí)戰(zhàn)干貨大致是一樣的。

加載證書

證書依然使用 keytool 生成 2048 長(zhǎng)度的 RSA 密鑰。

這里之前使用了比較“暴力”的方式直接讀取 KeyStore 然后使用公私鑰,本次將 KeyStore 加載的證書轉(zhuǎn)變?yōu)?JOSE 規(guī)范中的 JWK(Json Web Key)。

JWT

JWT 在 Spring Security 中被定義為org.springframework.security.oauth2.jwt.Jwt對(duì)象,對(duì)于 JWT 的操作可以抽象為兩個(gè)方面。

生成 JWT

首先就是生成 JWT。目前的 Spring Security 本身是不提供這個(gè)能力的,只有在孵化中的Spring Authorization Server提供了生成 JWT 的抽象接口JwtEncoder:

 
 
 
  1. @FunctionalInterface 
  2. public interface JwtEncoder { 
  3.    Jwt encode(JoseHeader headers, JwtClaimsSet claims) throws JwtEncodingException; 

JWT 的Header和Claims也被相應(yīng)地抽象為JoseHeader和JwtClaimsSet。

于是我使用Nimbus對(duì)JwtEncoder進(jìn)行了實(shí)現(xiàn),其實(shí)是搬運(yùn)了Spring Authorization Server的實(shí)現(xiàn)。當(dāng)然也不是原版照搬,只是保證了門面一致,這樣后續(xù)如果這個(gè)項(xiàng)目成熟了之后我們就可以無縫兼容了。

解析 JWT

既然有JwtEncoder必然有JwtDecoder。這個(gè)在Spring Security OAuth2 Client中是提供實(shí)現(xiàn)的,同樣對(duì)其稍微加以改造。另外這個(gè)解碼器不但負(fù)責(zé)將 JWT 字符串解析為 JWT 對(duì)象,它還承擔(dān)了校驗(yàn)功能,這里有一個(gè)委托校驗(yàn)器DelegatingOAuth2TokenValidator,我們可以靈活定制來執(zhí)行多個(gè) JWT 校驗(yàn)策略。

Token 對(duì)

我們都知道通常 JWT 中的 Token 都是成對(duì)出現(xiàn)的。之前只是簡(jiǎn)單用一個(gè)類來封裝了accessToken和refreshToken的字符串形態(tài)。這次使用了spring ecurity oauth2 core提供的OAuth2AccessTokenResponse:

 
 
 
  1. public final class OAuth2AccessTokenResponse { 
  2.  
  3.    private OAuth2AccessToken accessToken; 
  4.  
  5.    private OAuth2RefreshToken refreshToken; 
  6.  
  7.    private Map additionalParameters; 

這個(gè)類表達(dá)的內(nèi)容更加豐富和靈活。對(duì)應(yīng)的 json:

 
 
 
  1.   "accessToken": { 
  2.     "tokenValue": "eyJraWQiOiJmZWxvcmRjbiIsInR5cCI6IkpXVCIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiJhbGwiLCJhdWQiOiJyb290IiwiaXNzIjoiaHR0cHM6XC9cL2ZlbG9yZC5jbiIsInNjb3BlcyI6WyJST0xFX0FETUlOIiwiUk9MRV9BUFAiXSwiZXhwIjoxNjE2ODM4NTg4LCJpYXQiOjE2MTY4MzQ5ODgsImp0aSI6IjBiYTUwZjFhLTI0N2YtNDJlYi05NzZiLTkyZWM5NDg2YjA2MCJ9.dwUK4ZgqhalKWu5AA8ZqaHjD2WPerhiF8lmybZGAorbncWdfVk7iAKUdRZunUekZmab_FsVpwprWIQpqSLtp6tz28sI71gO2StEeye5Vv4JRZKys68q2LGOAqMVJnBisEl211b5ASHSlP1qleU_TDxO_rgems76ZFD-kc1KmyelsoiBhmT3aD2_A_3fUmH7mV0jnC0rHauzOpS0AWnuPJaXbGPqrWotkQ_oqly47jipfNsPl_PUY1urng1wSx4QyblS8UgK-n5wJABhSN550WlwNLuC10ZckbhE5gazM0mD86mA_Xepe7LY5rjGNvO-Cz9k44TaURnTdSBdyy_EOiQ", 
  3.     "issuedAt": { 
  4.       "epochSecond": 1616834988, 
  5.       "nano": 891000000 
  6.     }, 
  7.     "expiresAt": { 
  8.       "epochSecond": 1616838588, 
  9.       "nano": 891000000 
  10.     }, 
  11.     "tokenType": { 
  12.       "value": "Bearer" 
  13.     }, 
  14.     "scopes": [ 
  15.       "ROLE_ADMIN", 
  16.       "ROLE_APP" 
  17.     ] 
  18.   }, 
  19.   "refreshToken": { 
  20.     "tokenValue": "eyJraWQiOiJmZWxvcmRjbiIsInR5cCI6IkpXVCIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiJhbGwiLCJhdWQiOiJyb290IiwiaXNzIjoiaHR0cHM6XC9cL2ZlbG9yZC5jbiIsInNjb3BlcyI6WyJST0xFX0FETUlOIiwiUk9MRV9BUFAiXSwiaWF0IjoxNjE2ODM0OTg4LCJqdGkiOiI3N2RhODk3NC0xMjM0LTQ5NzctOWU1MS1hOGY2NTdjMzA2NjAifQ.O9YYxkevkrTke7GbK2R5LGphnJ9vd07yFSwPs2gEZ94ObPkIs1wJ5gvlNOIlni_BYMNO-nMB8TiX0w-RQSwo-sbVLqeUHqv6NEXXmPJiWVmXTFVJf2b6lqW5Re7clXGvkFMw14ptAF6cpThDEE5XF4eCI8CDKKPWqNxY-8NvokwIY3NMXB1ofuHHRqjMyVUwNjOv6eaTJFTwebPy6Saem9kvaL_X1v9Drok6azbg5DSP1zKnbVazTaOs4aBZd5Firib3r_BGXdaJWAgJKfpP61__muVdujgkppMVU8fC9pqfnb6IqEaAOIZ69lrezA1K0QFinOhgcC2YZFxFoLL-IQ", 
  21.     "issuedAt": { 
  22.       "epochSecond": 1616834988, 
  23.       "nano": 891000000 
  24.     }, 
  25.     "expiresAt": null 
  26.   }, 
  27.   "additionalParameters": {} 

總結(jié)

其它大致沒有改變多少,盡可能保證了原來的味道,又能夠兼容 Spring Security 未來的風(fēng)格。在代碼迭代的過程中,如何能夠同時(shí)做到兼容和靈活?關(guān)鍵就在于是否制定了統(tǒng)一的入口抽象和出口抽象。如果你能夠做到這一點(diǎn),你的代碼質(zhì)量就會(huì)明顯的提高很多。


本文題目:忙里偷閑又把自己的JWT實(shí)現(xiàn)改進(jìn)了一下
URL標(biāo)題:http://m.5511xx.com/article/coeopdd.html