使用 Redis

在 15.5.2.1 小节塔建授权服务器时,我们配置将生成的令牌 Access Token 存在内存中,当时提供的 TokenStore 实例是 InMemoryTokenStore:

@Configuration
public class AccessTokenConfig {
    @Bean
    TokenStore tokenStore() {
        return new InMemoryTokenStore();
    }
}

事实上,TokenStore 接口有多种不同的实现类,如图15-17所示

image 2024 04 16 12 37 45 131
Figure 1. 图15-17 TokenStore 实现类

可以看到,我们有多种方式来存储 Access Token:

  • InMemoryTokenStore:这是我们之前使用的方式,即将 Access Token 存到内存中,单机使用这个没有问题,但是在分布式环境下不推荐使用。

  • JdbcTokenStore:将 Access Token 保存到数据中,方便和其他应用共享令牌信息。

  • JwtTokenStore:这个其实不算是存储,因为使用了 JWT 之后,在生成的 JWT 中就有用户的所有信息,服务端不需要保存。

  • RedisTokenStore:将 Access Token 存到 Redis 中。

  • JwkTokenStore:这个只在资源服务器上使用,主要作用是解码 JWT 并使用相应的 JWK 验证其签名(JWS)。

虽然这里支持的方案比较多,但是我们常用的方案实际上主要是这两个:RedisTokenStore 和 JwtTokenStore,JwtTokenStore 后面会做介绍,这里我们门先来看一下 RedisTokenStore。

首先我们启动一个 Redis。

接下来在 15.5.2.1 小节搭建的授权服务器基础上,添加 Redis 依赖,代码如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

然后在 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);
    }

}

只需要修改一下 TokenStore 实例即可。

配置完成后,再去启动 auth_server,此时授权服务器生成的 Access Token 令牌就会保存到 Redis 中。Access Token 在 Redis 中的有效期就是令牌的有效期,也正是因为 Redis 中的这种过期机制,让它在存储 Access Token 时具有天然的优势。