OAuth2
預設的AccessToken
是由DefaultAccessTokenConverter
生成,是具有唯一性的UUID
隨機字串,我們如果想要使用JWT
來格式化AccessToken
就需要使用JwtAccessTokenConverter
來進行格式化,當然如果你有自己獨特的業務可以自己實現AccessTokenConverter
介面,並將實現類交付給IOC
託管即可。
ApiBoot
內部整合了DefaultAccessTokenConverter
(預設)、JwtAccessTokenConverter
,只需要一個配置就可以實現相互轉換。
部落格原文地址:blog.yuqiyu.com/apiboot-sec…
相關文件
- ApiBoot OAuth2官方文件:apiboot.minbox.io/zh-cn/docs/…
- ApiBoot 開源原始碼:minbox-projects/api-boot
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: 恆宇少年複製程式碼
祕鑰格式不限,如:
特殊字串
、漢字
、數字
、字母
....
執行測試
見證奇蹟的時刻到了,我們通過IDEA
的XxxApplication
方式來啟動本章專案,嘗試使用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
有預設的客戶端配置資訊為ApiBoot
、ApiBootSecret
,為了方便演示,這裡沒做修改,如需修改請檢視ApiBoot OAuth文件,如果你感覺控制檯列印的json
不美觀,閱讀性太差,可以使用線上格式化JSON工具.
敲黑板,劃重點
使用ApiBoot
來格式化OAuth2
的AccessToken
是不是特別簡單?省去了我們自己去建立JwtAccessTokenConverter
例項,然後還需要將例項放入IOC
繁瑣的步驟,更多使用詳解敬請期待~~
程式碼示例
如果您喜歡本篇文章請為原始碼倉庫點個Star
,謝謝!!!本篇文章示例原始碼可以通過以下途徑獲取,目錄為apiboot-security-oauth-use-jwt
:
- Gitee:gitee.com/minbox-proj…
簽到送書活動進行中
自律改變人生,恆宇少年回饋粉絲,給大家的福利,請訪問blog.yuqiyu.com/welfare/瞭解詳情。
作者個人 部落格
使用開源框架 ApiBoot 助你成為Api介面服務架構師