還不會使用JWT格式化OAuth2令牌嗎?

恆宇少年發表於2019-12-11

OAuth2預設的AccessToken是由DefaultAccessTokenConverter生成,是具有唯一性的UUID隨機字串,我們如果想要使用JWT來格式化AccessToken就需要使用JwtAccessTokenConverter來進行格式化,當然如果你有自己獨特的業務可以自己實現AccessTokenConverter介面,並將實現類交付給IOC託管即可。

ApiBoot內部整合了DefaultAccessTokenConverter(預設)、JwtAccessTokenConverter,只需要一個配置就可以實現相互轉換。

部落格原文地址:blog.yuqiyu.com/apiboot-sec…

相關文件

JWT加密祕鑰

JWT瞭解的同學應該知道,它內部不可逆的部分採用的是RSA加密,在加密過程中需要一個祕鑰,在JwtAccessTokenConverter實現類中採用了6位隨機字串作為祕鑰,相關原始碼如下:

/**
 * Helper that translates between JWT encoded token values and OAuth authentication
 * information (in both directions). Also acts as a {@link TokenEnhancer} when tokens are
 * granted.
 *
 * @see TokenEnhancer
 * @see AccessTokenConverter
 *
 * @author Dave Syer
 * @author Luke Taylor
 */
public class JwtAccessTokenConverter implements TokenEnhancer, AccessTokenConverter, InitializingBean {
  .....

    private String verifierKey = new RandomValueStringGenerator().generate();

    private Signer signer = new MacSigner(verifierKey);

    private String signingKey = verifierKey;
}  複製程式碼

這種形式雖然在某一些層面上是唯一的,實在感覺不太嚴謹,所以ApiBoot新增一個配置,可以自定義這個加密祕鑰signingKey欄位。

建立示例專案

為了本章的演示效果,我們使用IDEA來建立一個SpringBoot專案,pom.xml檔案內相關的依賴如下所示:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.minbox.framework</groupId>
    <artifactId>api-boot-starter-security-oauth-jwt</artifactId>
  </dependency>
</dependencies>
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.minbox.framework</groupId>
      <artifactId>api-boot-dependencies</artifactId>
      <version>2.2.0.RELEASE</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>複製程式碼

依賴新增完成後下面我們配置下測試的使用者以及客戶端資訊

配置記憶體使用者

我們在獲取AccessToken時使用的password授權型別,所以我們需要在application.yml檔案內配置登入使用者所使用的使用者名稱、密碼,如下所示:

api:
  boot:
    security:
      users:
        - username: yuqiyu
          password: 123456複製程式碼

本章為了演示JWT格式化AccessToken,驗證的使用者採用記憶體方式配置,瞭解詳情

開啟JWT轉換

ApiBoot OAuth2預設使用DefaultAccessTokenConverter實現類來格式化AccessToken,如果我們想要切換到JwtAccessTokenConverter,需要在application.yml新增一個配置,如下所示:

api:
  boot:
    oauth:
      # 啟用JWT,用於格式化AccessToken
      jwt:
        enable: true複製程式碼

配置加密祕鑰

在本文開頭說到了JwtAccessTokenConverter實現類內採用的是6位隨機字串的方式來作為RSA加密的祕鑰,ApiBoot OAuth2提供了引數配置可以進行自定義,如下所示:

api:
  boot:
    oauth:
      jwt:
        # 加密祕鑰
        sign-key: 恆宇少年複製程式碼

祕鑰格式不限,如:特殊字串漢字數字字母....

執行測試

見證奇蹟的時刻到了,我們通過IDEAXxxApplication方式來啟動本章專案,嘗試使用CURL方式獲取AccessToken如下所示:

➜ ~ curl ApiBoot:ApiBootSecret@localhost:9090/oauth/token -d 'grant_type=password&username=yuqiyu&password=123456'
{
    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsiYXBpIl0sInVzZXJfbmFtZSI6Inl1cWl5dSIsInNjb3BlIjpbImFwaSJdLCJleHAiOjE1NzU5NTMwNDgsImF1dGhvcml0aWVzIjpbIlJPTEVfYXBpIl0sImp0aSI6ImQxMDNmNDYwLTk3YzMtNGNiZS05OWM4LWYzZjU2MmRhMDZhOCIsImNsaWVudF9pZCI6IkFwaUJvb3QifQ.HMHRBCIGPZNlkJPCnXaktMWxXEW-5roo7tdQR1JpCyY", 
    "token_type": "bearer", 
    "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsiYXBpIl0sInVzZXJfbmFtZSI6Inl1cWl5dSIsInNjb3BlIjpbImFwaSJdLCJhdGkiOiJkMTAzZjQ2MC05N2MzLTRjYmUtOTljOC1mM2Y1NjJkYTA2YTgiLCJleHAiOjE1Nzg1Mzc4NDgsImF1dGhvcml0aWVzIjpbIlJPTEVfYXBpIl0sImp0aSI6ImY1NDMxZTMzLWE1YzMtNGVmNC1hZDM0LTk1MGQ3ODliYTRiZCIsImNsaWVudF9pZCI6IkFwaUJvb3QifQ.TfJ5vThvaibV2kVo2obHqnYzmYm-GsdtRLoB3RJbkrg", 
    "expires_in": 6925, 
    "scope": "api", 
    "jti": "d103f460-97c3-4cbe-99c8-f3f562da06a8"
}複製程式碼

ApiBoot OAuth有預設的客戶端配置資訊為ApiBootApiBootSecret,為了方便演示,這裡沒做修改,如需修改請檢視ApiBoot OAuth文件,如果你感覺控制檯列印的json不美觀,閱讀性太差,可以使用線上格式化JSON工具.

敲黑板,劃重點

使用ApiBoot來格式化OAuth2AccessToken是不是特別簡單?省去了我們自己去建立JwtAccessTokenConverter例項,然後還需要將例項放入IOC繁瑣的步驟,更多使用詳解敬請期待~~

程式碼示例

如果您喜歡本篇文章請為原始碼倉庫點個Star,謝謝!!!本篇文章示例原始碼可以通過以下途徑獲取,目錄為apiboot-security-oauth-use-jwt

簽到送書活動進行中

自律改變人生,恆宇少年回饋粉絲,給大家的福利,請訪問blog.yuqiyu.com/welfare/瞭解詳情。

作者個人 部落格

使用開源框架 ApiBoot 助你成為Api介面服務架構師

相關文章