OAuth2
默認(rèn)的AccessToken
是由DefaultAccessTokenConverter
生成瓶您,是具有唯一性的UUID
隨機(jī)字符串舟陆,我們?nèi)绻胍褂?code>JWT來格式化AccessToken
就需要使用JwtAccessTokenConverter
來進(jìn)行格式化坠非,當(dāng)然如果你有自己獨(dú)特的業(yè)務(wù)可以自己實(shí)現(xiàn)AccessTokenConverter
接口敏沉,并將實(shí)現(xiàn)類交付給IOC
托管即可。
ApiBoot
內(nèi)部集成了DefaultAccessTokenConverter
(默認(rèn))炎码、JwtAccessTokenConverter
赦抖,只需要一個(gè)配置就可以實(shí)現(xiàn)相互轉(zhuǎn)換。
博客原文地址:https://blog.yuqiyu.com/apiboot-security-oauth-use-jwt.html
相關(guān)文檔
- ApiBoot OAuth2官方文檔:http://apiboot.minbox.io/zh-cn/docs/api-boot-oauth.html
- ApiBoot 開源源碼:minbox-projects/api-boot
ApiBoot Security OAuth組件系列文章
- ApiBoot實(shí)現(xiàn)零代碼整合Spring Security & OAuth2
- ApiBoot零代碼整合Spring Security的JDBC方式獲取AccessToken
- 見過這么簡(jiǎn)單的方式整合Spring Security & OAuth2的自定義查詢用戶嗎辅肾?
- Spring Security & OAuth2實(shí)現(xiàn)短信驗(yàn)證碼方式獲取AccessToken
- 原來Spring Security整合OAuth2后開放權(quán)限攔截路徑還能這么玩?
- 我以為OAuth2整合JWT是很困難的事情轮锥,直到我使用了ApiBoot矫钓,一切都變了!
- 來看看OAuth2怎么設(shè)置AccessToken有效期時(shí)間時(shí)長(zhǎng)
- OAuth2使用Redis來存儲(chǔ)客戶端信息以及AccessToken
JWT加密秘鑰
對(duì)JWT
了解的同學(xué)應(yīng)該知道舍杜,它內(nèi)部不可逆的部分采用的是RSA
加密新娜,在加密過程中需要一個(gè)秘鑰
,在JwtAccessTokenConverter
實(shí)現(xiàn)類中采用了6位隨機(jī)字符串作為秘鑰既绩,相關(guān)源碼如下:
/**
* 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;
}
這種形式雖然在某一些層面上是唯一的概龄,實(shí)在感覺不太嚴(yán)謹(jǐn),所以ApiBoot
添加一個(gè)配置饲握,可以自定義這個(gè)加密秘鑰signingKey
字段私杜。
創(chuàng)建示例項(xiàng)目
為了本章的演示效果,我們使用IDEA
來創(chuàng)建一個(gè)SpringBoot
項(xiàng)目救欧,pom.xml
文件內(nèi)相關(guān)的依賴如下所示:
<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>
依賴添加完成后下面我們配置下測(cè)試的用戶
以及客戶端信息
衰粹。
配置內(nèi)存用戶
我們?cè)讷@取AccessToken
時(shí)使用的password
授權(quán)類型,所以我們需要在application.yml
文件內(nèi)配置登錄用戶
所使用的用戶名笆怠、密碼铝耻,如下所示:
api:
boot:
security:
users:
- username: yuqiyu
password: 123456
本章為了演示
JWT
格式化AccessToken
,驗(yàn)證的用戶采用內(nèi)存方式配置蹬刷,了解詳情瓢捉。
開啟JWT轉(zhuǎn)換
ApiBoot OAuth2
默認(rèn)使用DefaultAccessTokenConverter
實(shí)現(xiàn)類來格式化AccessToken
频丘,如果我們想要切換到JwtAccessTokenConverter
,需要在application.yml
添加一個(gè)配置泡态,如下所示:
api:
boot:
oauth:
# 啟用JWT搂漠,用于格式化AccessToken
jwt:
enable: true
配置加密秘鑰
在本文開頭說到了JwtAccessTokenConverter
實(shí)現(xiàn)類內(nèi)采用的是6位隨機(jī)字符串的方式來作為RSA
加密的秘鑰,ApiBoot OAuth2
提供了參數(shù)配置可以進(jìn)行自定義兽赁,如下所示:
api:
boot:
oauth:
jwt:
# 加密秘鑰
sign-key: 恒宇少年
秘鑰格式不限状答,如:
特殊字符串
、漢字
刀崖、數(shù)字
惊科、字母
....
運(yùn)行測(cè)試
見證奇跡的時(shí)刻到了,我們通過IDEA
的XxxApplication
方式來啟動(dòng)本章項(xiàng)目亮钦,嘗試使用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
有默認(rèn)的客戶端配置信息為ApiBoot
馆截、ApiBootSecret
,為了方便演示蜂莉,這里沒做修改蜡娶,如需修改請(qǐng)查看ApiBoot OAuth文檔,如果你感覺控制臺(tái)打印的json
不美觀映穗,閱讀性太差窖张,可以使用在線格式化JSON工具.
敲黑板,劃重點(diǎn)
使用ApiBoot
來格式化OAuth2
的AccessToken
是不是特別簡(jiǎn)單蚁滋?省去了我們自己去創(chuàng)建JwtAccessTokenConverter
實(shí)例宿接,然后還需要將實(shí)例放入IOC
繁瑣的步驟,更多使用詳解敬請(qǐng)期待~~
代碼示例
如果您喜歡本篇文章請(qǐng)為源碼倉(cāng)庫(kù)點(diǎn)個(gè)Star
辕录,謝謝D丽!走诞!
本篇文章示例源碼可以通過以下途徑獲取副女,目錄為apiboot-security-oauth-use-jwt
:
簽到送書活動(dòng)進(jìn)行中
自律改變?nèi)松阌钌倌昊仞伔劢z蚣旱,給大家的福利碑幅,請(qǐng)?jiān)L問https://blog.yuqiyu.com/welfare/了解詳情。