本文我将从三个方面来做优化:令牌往哪里存?
客户端信息入库
第三方应用优化
好,我们分别来看。
「注意,本文的案例在本系列第三篇文章的基础上修改而来。」
1.令牌往哪里存?
在我们配置授权码模式的时候,有两个东西当时存在了内存中:InMemoryAuthorizationCodeServices 这个表授权码存在内存中。
InMemoryTokenStore 表示生成的令牌存在内存中。
授权码用过一次就会失效,存在内存中没什么问题,但是令牌,我们实际上还有其他的存储方案。
我们所使用的 InMemoryTokenStore 实现了 TokenStore 接口,我们来看下 TokenStore 接口的实现类:
可以看到,我们有多种方式来存储 access_token。InMemoryTokenStore,这是我们之前使用的,也是系统默认的,就是将 access_token 存到内存中,单机应用这个没有问题,但是在分布式环境下不推荐。
JdbcTokenStore,看名字就知道,这种方式令牌会被保存到数据中,这样就可以方便的和其他应用共享令牌信息。
JwtTokenStore,这个其实不是存储,因为使用了 jwt 之后,在生成的 jwt 中就有用户的所有信息,服务端不需要保存,这也是无状态登录,关于 OAuth2 结合 JWT 的用法,松哥本系列未来的文章中,也会详细介绍,这里就不再多说。
RedisTokenStore,这个很明显就是将 access_token 存到 redis 中。
JwkTokenStore,将 access_token 保存到 JSON Web Key。
虽然这里支持的方案比较多,但是我们常用的实际上主要是两个,RedisTokenStore 和 JwtTokenStore,JwtTokenStore 的比较复杂,我会在后面专门写文章来单独介绍,这里先来跟大家演示存入 RedisTokenStore。
首先我们启动一个 Redis 服务,然后给 auth-server 添加 Redis 依赖:
org.springframework.boot
spring-boot-starter-data-redis
依赖添加成功后,在 application.properties 中添加 redis 配置:spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=123
配置完成后,我们修改 TokenStore 的实例,如下:@Configuration
public class AccessTokenConfig{
@Autowired
RedisConnectionFactory redisConnectionFactory;
@Bean
TokenStore tokenStore(){
return new RedisTokenStore(redisConnectionFactory);
}
}
然后分别启动 auth-server、client-app 以及 user-server,走一遍第三方登录流程,然后我们发现,派发的 access_token 在 redis 中也有一份:
可以看到,数据都存到 Redis 中了,access_token 这个 key 在 Redis 中的有效期就是授权码的有效期。正是因为 Redis 中的这种过期机制,让它在存储 access_token 时具有天然的优势。
2.客户端信息入库
在前面的文章中,客户端信息我们是直接存储在内存中的,像下面这样:@Override
public void configure(ClientDetailsServiceConfigurer cli