Spring Cloud Security:Oauth2结合JWT使用
创建oauth2-jwt-server模块
使用Redis存储令牌,在pom.xml中添加Redis相关依赖,在application.yml中添加redis相关配置
TokenStore 令牌的存储策略
令牌的存储策略,这里使用的是JwtTokenStore,使用JWT的令牌生成方式,还有以下两个比较常用的方式:
RedisTokenStore:将令牌存储到Redis中,此种方式相对于内存方式来说性能更好 JdbcTokenStore:将令牌存储到数据库中,需要新建从对应的表
RedisTokenStore
- 使用RedisTokenStore 存储令牌,在认证服务器配置中指定令牌的存储策略为Redis
添加在Redis中存储令牌的配置:
- 进行获取令牌操作,可以发现令牌已经被存储到Redis中。
JwtTokenStore 使用JWT存储令牌
AccessTokenConverter
AccessTokenConverter 令牌增强类,用于JWT令牌和OAuth身份进行转换。 作用是把token字符串转换成OAuth2AccessToken对象。
启动服务
运行项目后使用密码模式来获取令牌,访问如下地址:http://localhost:9401/oauth/token 发现获取到的令牌已经变成了JWT令牌。
Postman请求结果,获取到的access_token已经变成了JWT令牌。 将access_token拿到https://jwt.io/ 网站上去解析下可以获得其中内容。
{
"exp": 1572682831,
"user_name": "macro",
"authorities": [
"admin"
],
"jti": "c1a0645a-28b5-4468-b4c7-9623131853af",
"client_id": "admin",
"scope": [
"all"
]
}
TokenEnhancer 扩展JWT中存储的内容
有时候我们需要扩展JWT中存储的内容,这里我们在JWT中扩展一个key为enhance,value为enhance info的数据。
JwtTokenEnhancer
JwtTokenEnhancer 继承TokenEnhancer 实现一个JWT内容增强器,并实例化该JwtTokenEnhancer。
运行项目后使用密码模式来获取令牌,之后对令牌进行解析,发现已经包含扩展的内容。
问题:access_token不是jwt格式了
AccessTokenConverter 作用是把token字符串转换成OAuth2AccessToken对象。 TokenEnhancer作用是在OAuth2AccessToken 里添加额外的信息。 JwtAccessTokenConverter 即实现了AccessTokenConverter接口,也实现了TokenEnhancer接口。
JWT工具解析存储内容
修改UserController类,使用jjwt工具类来解析Authorization头中存储的JWT内容。 在pom.xml中添加JWT工具包依赖:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
刷新令牌
修改认证服务器的配置,在authorizedGrantTypes中增加授权类型:refresh_token
- 使用刷新令牌模式来获取新的令牌,访问地址:http://localhost:9401/oauth/token
完
参考地址
https://www.macrozheng.com/cloud/oauth2_jwt.html#%E4%BD%BF%E7%94%A8jwt%E5%AD%98%E5%82%A8%E4%BB%A4%E7%89%8C
|