成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

忙里偷閑又把自己的JWT實現改進了一下

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

 [[390140]]

之前在Spring Security 實戰干貨系列中我使用了 Spring 官方提供的spring-security-jwt作為JWT的實現。目前該工具包已經不再維護,而且對于最新推出的Spring Security OAuth2 Client 和 Spring Authorization Server都不是特別的兼容。所以抽了兩天時間結合這兩個新依賴重新實現了 JWT。

Nimbus 庫

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

改造的過程分享

流程上跟 Spring Security 實戰干貨大致是一樣的。

加載證書

證書依然使用 keytool 生成 2048 長度的 RSA 密鑰。

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

JWT

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

生成 JWT

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

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

JWT 的Header和Claims也被相應地抽象為JoseHeader和JwtClaimsSet。

于是我使用Nimbus對JwtEncoder進行了實現,其實是搬運了Spring Authorization Server的實現。當然也不是原版照搬,只是保證了門面一致,這樣后續如果這個項目成熟了之后我們就可以無縫兼容了。

解析 JWT

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

Token 對

我們都知道通常 JWT 中的 Token 都是成對出現的。之前只是簡單用一個類來封裝了accessToken和refreshToken的字符串形態。這次使用了spring ecurity oauth2 core提供的OAuth2AccessTokenResponse:

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

這個類表達的內容更加豐富和靈活。對應的 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": {} 

總結

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

 

責任編輯:武曉燕 來源: 碼農小胖哥
相關推薦

2020-12-17 08:39:36

Css前端html

2020-12-16 07:51:42

項目個人博客支付

2020-05-15 14:31:07

CPU分頁交換虛擬內存

2021-05-12 10:59:39

Kubernetes容器集群

2017-05-31 10:43:26

Windows Ser容器數據保護

2009-07-23 11:11:18

LRU緩存

2024-04-23 08:04:45

2023-04-03 09:00:28

2010-07-05 13:20:48

BoneCPBoneCP 0.6.Java連接池

2010-10-14 09:55:06

Ubuntu 10.1

2009-03-09 14:46:50

2013-07-08 09:30:55

2011-08-03 09:15:23

DORADO展現中間件

2021-09-20 11:41:56

Windows 11硬盤空間占用微軟

2021-09-27 14:33:01

Windows 11Windows微軟

2022-01-05 22:41:47

PintaPinta 2.0開源

2020-02-10 14:26:10

GitHub代碼倉庫

2021-04-21 14:19:52

javaignalHandle接口

2021-09-21 10:51:42

iOS蘋果系統

2024-03-25 02:00:00

Vite開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品久久久久久亚洲精品 | 精品免费国产一区二区三区 | 五月网婷婷 | 欧美久久电影 | 成人免费毛片在线观看 | 成人av电影免费在线观看 | 日日综合| 国产精品久久久久久久一区探花 | 亚洲a视频| 伊人网综合在线观看 | a级免费观看视频 | 日韩精品 电影一区 亚洲 | 亚洲97| 国产一区二区三区亚洲 | 日日夜夜天天 | 国产99久久精品一区二区永久免费 | 激情 婷婷 | 天天天天操 | 国产成人99久久亚洲综合精品 | 99精品国产一区二区三区 | 精品国产乱码久久久久久久久 | 午夜天堂精品久久久久 | 成人精品福利 | 91av亚洲 | 久久久www成人免费无遮挡大片 | 国产日韩久久 | 波多野结衣二区 | 精品永久| 一级片网址| 黄色一级片aaa | 国产成人免费一区二区60岁 | 久久精品一区二区 | 成年人的视频免费观看 | 久久久久九九九女人毛片 | 国产一区二区久久 | 成人精品一区二区三区中文字幕 | 啪啪综合网 | 成人av在线播放 | 欧美一区二区在线观看 | 成人av影院 | 亚洲精品一区中文字幕乱码 |