主题
REFRESH_TOKENS OAuth2 授权码与刷新令牌表
以 TOKEN 为主键存储 OAuth2 授权码和刷新令牌。凭证消费和轮换通过 将旧行ENABLED设置为0然后插入新行实现, TOKEN 值永不更新,保持主键不可变,完整保留审计链路。
授权码和刷新令牌均属敏感凭证,不应导出或写入日志。
位置
模型路径:/sysdata/data/tables/sec/REFRESH_TOKENS.tbl
物理表名:SZSYS_5_REFRESH_TOKENS
表结构
| 字段名 | 字段类型 | 字段描述 |
|---|---|---|
| TOKEN | VARCHAR(64) | 凭证值,主键。TOKEN_TYPE=1 时为授权码,/api/oauth2/authorize 生成;TOKEN_TYPE=2 时为刷新令牌,/api/oauth2/token 消费 code 后 INSERT 新行。刷新时旧行 ENABLED=0,INSERT 新行,TOKEN 永不更新 |
| TOKEN_TYPE | NUMBER(1) | 凭证类型:1 授权码,2 刷新令牌 |
| ACCESS_TOKEN | VARCHAR(64) | 关联的 access_token |
| USER_ID | VARCHAR(32) | 授权用户 ID |
| USER_DIRECTORY | VARCHAR(16) | 用户目录,sys 系统用户、external 外部用户 |
| APP_ID | VARCHAR(32) | 授信应用 ID |
| APP_NAME | VARCHAR(128) | 授信应用名称 |
| ENABLED | NUMBER(1) | 是否启用。1 有效,0 已消费/失效 |
| CODE_CHALLENGE | VARCHAR(128) | PKCE code challenge,仅授权码阶段写入,refresh_token 行传 NULL |
| CODE_CHALLENGE_METHOD | VARCHAR(8) | PKCE 挑战方式,仅授权码阶段写入,refresh_token 行传 NULL |
| NEW_REFRESH_TOKEN | VARCHAR(64) | 刷新时写入的新 refresh_token。消费旧 token 时记录,并发请求可据此查找已生成的新 token,无需内存缓存 |
| CREATE_TIME | TIMESTAMP | 创建时间 |
| EXPIRE_TIME | TIMESTAMP | TOKEN 过期时间。取值见 过期时间规范 |
凭证生命周期
/api/oauth2/authorize→ 在 REFRESH_TOKENS 中 INSERT 授权码行(TOKEN=code, TOKEN_TYPE=1, ENABLED=1)/api/oauth2/token→ 校验 code 后消费旧行(ENABLED=0) → 在 REFRESH_TOKENS 中 INSERT refresh_token 行(TOKEN_TYPE=2) → 同时在 ACCESS_TOKENS 中 INSERT 一行 access_token/api/oauth2/refreshToken→ 乐观锁消费旧 refresh_token 行(ENABLED=0) → INSERT 新 refresh_token 行(TOKEN_TYPE=2) → 更新 ACCESS_TOKENS 中对应 access_token 的值和过期时间
过期时间规范
凭证有效期按 TOKEN_TYPE 区分,创建时写入 EXPIRE_TIME,鉴权时校验 EXPIRE_TIME 判定过期。
| 凭证类型 | 有效期 | 说明 |
|---|---|---|
| 授权码(TOKEN_TYPE=1) | 10 分钟(600 秒) | /api/oauth2/authorize 生成的 code 有效时间 10 分钟 |
| 刷新令牌(TOKEN_TYPE=2) | 6 个月(按 30 天/月估算) | /api/oauth2/token 签发的 refresh_token,刷新轮换时新行同样按此有效期写入 |
表索引
| 类型 | 名称 | 字段列表 | 是否唯一 | 说明 |
|---|---|---|---|---|
| 主键 | PRIMARY | TOKEN | 是 | TOKEN 为主键,不可变,配合 ENABLED 区分有效/消费状态 |
