OAuth2
默认的AccessToken
是由DefaultAccessTokenConverter
生成,是具有唯一性的UUID
随机字符串,我们如果想要使用JWT
来格式化AccessToken
就需要使用JwtAccessTokenConverter
来进行格式化,当然如果你有自己独特的业务可以自己实现AccessTokenConverter
接口,并将实现类交付给IOC
托管即可。
ApiBoot
内部集成了DefaultAccessTokenConverter
(默认)、JwtAccessTokenConverter
,只需要一个配置就可以实现相互转换。
相关文档
- ApiBoot OAuth2官方文档:https://apiboot.minbox.org/zh-cn/docs/api-boot-oauth.html
- 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
: