using-state.md 2.4 KB
Newer Older
智布道's avatar
智布道 已提交
1 2
# 使用State

智布道's avatar
智布道 已提交
3 4 5 6 7 8 9 10 11
## state使用的流程

在JustAuth中`state`参数的使用流程如下:

1. 获取`authorizeUrl`时创建`state`(开发者创建,如果不创建则系统默认生成)
2. 缓存`state`(JustAuth执行)
3. 内置的缓存调度器自动清除已过期的`state`(JustAuth执行)

## 创建state(开发者)
12
`state`在OAuth授权流程中是一个**非必要但很重要**的参数,就如[名词解释](https://justauth.wiki/#/explain?id=justauth中的关键词)中描述的:`state`是用来保持授权会话流程完整性,防止CSRF攻击的安全的随机的参数,**由开发者生成**
智布道's avatar
智布道 已提交
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53

在JustAuth中提供了一个默认的创建state的方法,使用方式:

```java
String state = AuthStateUtils.createState()
```

`createState`的内部实现其实就是生成了一个UUID(采用 jdk 9 的形式,优化性能),该工具是直接copy自[mica](https://github.com/lets-mica/mica/blob/master/mica-core/src/main/java/net/dreamlu/mica/core/utils/StringUtil.java)`mica`是一个SpringBoot微服务高效开发工具集,开源地址:[https://github.com/lets-mica/mica](https://github.com/lets-mica/mica)),关于mica uuid生成方式的压测结果,可以参考:https://github.com/lets-mica/mica-jmh/wiki/uuid。

除此之外,开发者还可以自己生成特定的`state`参数。

## 缓存state(JustAuth)

在JustAuth中,内置了一个基于map的state缓存器,默认缓存有效期为3分钟(缓存配置见`AuthCacheConfig.java`)。`AuthCacheConfig`中包含两个配置参数:

- `timeout` 缓存过期时间,默认3分钟
- `schedulePrune` 是否开启定时清理过期state的任务,默认开启。如果不开启,则需要开发者自己对state做处理,防止map存入过多内容

缓存state的操作是在`getRealState`中触发的,不需要开发者自己处理
```java
/**
 * 获取state,如果为空, 则默认取当前日期的时间戳
 *
 * @param state 原始的state
 * @return 返回不为null的state
 */
protected String getRealState(String state) {
    if (StringUtils.isEmpty(state)) {
        state = UuidUtils.getUUID();
    }
    // 缓存state
    authStateCache.cache(state, state);
    return state;
}
```

注:关于自定义缓存,请参考下节内容。

## 清理state(JustAuth)

JustAuth内置了一个缓存调度器,默认3分钟清理一次过期的`state`,缓存清理时间可以通过`AuthCacheConfig.timeout`进行修改,不建议修改太大。