天天看點

jet token過期是定時的還是無操作_JWT在開發中的實戰操作(附帶生産級别代碼)...

熬夜熬到差不多晚上2點寫的,有用的兄弟,必須給我一個關注和大大的贊了!!!!

jet token過期是定時的還是無操作_JWT在開發中的實戰操作(附帶生産級别代碼)...

發了上一篇 jwt 相關後 後反響熱烈。如果沒有來得及去看的話建議先看上一篇。

但是也遺留了一些問題。應廣大讀者的要求。是以從實戰角度出發解決這些問題。我們基于 springboot 2.1.6.RELEASE 版本搞一些操作來示範如何在實際開發中使用jwt。主要依賴如下

jet token過期是定時的還是無操作_JWT在開發中的實戰操作(附帶生産級别代碼)...

通過spring security 和jwt 進行結合來完整實作基于jwt 的安全控制。spring-security-jwt 是spring官方的jwt工具包 。 核心方法隻有一個: org.springframework.security.jwt.JwtHelper; 我們用到的就2個方法,其他自己學習:

  • encode(CharSequence content, Signer signer)顧名思義 編碼 需要指定payload 跟簽名算法
  • decodeAndVerify(String token, SignatureVerifier verifier)方法 用來 驗證token是否合法 同時解碼 payload成明文 這裡不驗證過期時間

這樣生成jwt 和驗證解密jwt 的方法都有了,我們編寫自己的jwt生成方法。還是先設計一下流程:

  • 使用者登入 驗證通過 傳回其兩個token
  • access_token 用來日常使用 Bearer Token 過期時間7天(也可以自定義)
  • refresh_token 用來令牌續期。過期時間大于access_token 。 當refresh_token不過期,能為access_token 續期。
  • 上述兩個token總是成對出現。

根據生成jwt的方法我們需要進行簽名算法實作。這裡我們采用RSA算法。通過java 提供的keytool 生成jks檔案 或者store 或者公私鑰串,看你愛好。我這裡生成jks檔案作為公私鑰存儲媒體。放到資源目錄下, 然後解析jks的核心方法為:

jet token過期是定時的還是無操作_JWT在開發中的實戰操作(附帶生産級别代碼)...

擷取鑰匙對配合上面的JwtHelper 我們就能生成自己的jwt token了。jwt token 是可以攜帶資訊的,是以我們會定義一個JwtClaims 作為jwt中間那一段的定義類。生成器方法如下:

jet token過期是定時的還是無操作_JWT在開發中的實戰操作(附帶生産級别代碼)...

因為上面說了token 成對出現 是以對外我們提供一個TokenPairBuilder 來生成token對。同時為了處理續期問題和校驗問題我們把這個token對放入redis。過期時間按照refresh_token的時間來算。這樣當access_token過期 就通過refresh 來重新整理,當兩個都過期就需要重新登入。完美契合了緩存過期時間。每次token對的生成都伴随緩存的token重置。當請求判定token 與緩存不一緻就可以防止同時存在兩個可用token的問題。而且還可以實作防止多端登入的業務需求。同時下線邏輯或者角色權限更改 都可以通過清除redis中的token來處理。

核心代碼清單:

  • SecureUser 自定義spring security userDetails 用來攜帶定制 的使用者資訊
  • KeyPairFactory 解析RSA 鑰匙對 用來jwt 加解密
  • JwtTokenStorage 對jwt進行儲存。通過spring cache 實作 JwtTokenCacheStorage
  • JwtPairBuilder token對生成器
  • JwtAuthenticationFilter jwt token驗證過濾器 用來驗證請求中的jwt access_token
  • RefreshJwtTokenFilter 重新整理token過濾器 處理重新整理token 邏輯
  • CustomUsernamePasswordAuthenticationFilter 自定義登入器處理登入參數問題。
  • MultiWebSecurityConfig spring security 安全配置 結合jwt

參考上面代碼清單可以看我給的demo, 生産可用 有些地方按照你需要的業務實作

代碼位址:gitee.com/felord/dax-backend.git

有什麼疑問可留言,不行了扛不住了。

jet token過期是定時的還是無操作_JWT在開發中的實戰操作(附帶生産級别代碼)...

繼續閱讀