阅读完需:约 3 分钟
令牌往哪里存
在我们配置授权码模式的时候,有两个东西当时存在了内存中:
- InMemoryAuthorizationCodeServices 这个表授权码存在内存中。
- InMemoryTokenStore 表示生成的令牌存在内存中 。
授权码用过一次就会失效,存在内存中没什么问题,但是令牌,我们实际上还有其他的存储方案。
我们所使用的 InMemoryTokenStore 实现了 TokenStore 接口,我们来看下 TokenStore 接口的实现类:

可以看到,我们有多种方式来存储 access_token。
可以看到,我们有多种方式来存储 access_token。
- 1. InMemoryTokenStore,这是我们之前使用的,也是系统默认的,就是将 access_token 存到内存中,单机应用这个没有问题,但是在分布式环境下不推荐。
- 2. JdbcTokenStore,看名字就知道,这种方式令牌会被保存到数据库中,这样就可以方便的和其他应用共享令牌信息。
- 3. JwtTokenStore,这个其实不是存储,因为使用了 jwt 之后,在生成的 jwt 中就有用户的所有信息,服务端不需要保存,这也是无状态登录。
- 4. RedisTokenStore,这个很明显就是将 access_token 存到 redis 中。
- 5. JwkTokenStore,将 access_token 保存到 JSON Web Key。虽然这里支持的方案比较多,但是我们常用的实际上主要是两个,RedisTokenStore 和JwtTokenStore,JwtTokenStore 的比较复杂。
首先我们启动一个 Redis 服务,然后给 auth-server 添加 Redis 依赖: 首先我们启动一个 Redis 服务,然后给 auth-server 添加 Redis 依赖:
首先我们启动一个 Redis 服务,然后给 auth-server 添加 Redis 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
依赖添加成功后,在 application.properties 中添加 redis配置:
spring.redis.port=6379
spring.redis.host=127.0.0.1
………………………………………………
配置完成后,我们修改 TokenStore
AccessTokenConfig
@Configuration
public class AccessTokenConfig {
@Autowired
RedisConnectionFactory redisConnectionFactory;
@Bean
TokenStore tokenStore(){
return new RedisTokenStore(redisConnectionFactory);
//在内存中存储令牌
// return new InMemoryTokenStore();
}
}
然后走一遍第三方登录流程,然后我们发现,派发的 access_token 在 redis 中也有一份:

可以看到,数据都存到 Redis 中了,access_token 这个 key 在 Redis 中的有效期就是授权码的有效期。正是因为 Redis 中的这种过期机制,让它在存储 access_token 时具有天然的优势