|
| 1 | +# Keylo 1.1.0 发布说明 |
| 2 | + |
| 3 | +发布日期:2026年4月 |
| 4 | + |
| 5 | +## 版本定位 |
| 6 | + |
| 7 | +Keylo 1.1.0 是 1.0 正式发布后的第一个安全增强版本,重点方向是**生产安全加固**、**配置灵活性提升**和**代码健壮性改善**。本版本不引入破坏性 API 变更,可直接平滑升级。 |
| 8 | + |
| 9 | +--- |
| 10 | + |
| 11 | +## 主要改进 |
| 12 | + |
| 13 | +### 🔐 安全加固 |
| 14 | + |
| 15 | +#### 客户端密钥 bcrypt 哈希存储 |
| 16 | +客户端密钥(`client_secret`)不再以明文形式存储于数据库,改为 bcrypt 哈希。即使数据库泄露,攻击者也无法直接获取有效密钥。 |
| 17 | + |
| 18 | +**升级注意**:现有客户端需重置密钥,新密钥将以哈希形式存储。 |
| 19 | + |
| 20 | +#### 生产环境强制 Redis 限流 |
| 21 | +当 `ENVIRONMENT=production` 时,若 Redis 不可用,限流中间件将拒绝请求,而不再降级为内存模式。这防止了 Redis 故障时限流保护静默失效的风险。 |
| 22 | + |
| 23 | +#### 密码复杂度策略 |
| 24 | +注册和修改密码接口现在强制要求密码同时包含: |
| 25 | +- 至少一个大写字母 |
| 26 | +- 至少一个小写字母 |
| 27 | +- 至少一个数字 |
| 28 | +- 至少一个特殊字符(如 `!@#$%^&*`) |
| 29 | + |
| 30 | +#### OAuth state 原子消费(GETDEL) |
| 31 | +OAuth 回调中的 state 验证改为原子 `GETDEL` 操作,消除了读取和删除之间的 TOCTOU 竞态条件,防止 state 被重放利用。 |
| 32 | + |
| 33 | +#### 服务 Token audience 严格校验 |
| 34 | +服务 Token 的 `aud` 字段现在在 JWT 层强制验证,不再仅依赖业务层检查,确保服务 Token 不会被跨服务滥用。 |
| 35 | + |
| 36 | +#### OAuth 提供商 URL 强制 HTTPS |
| 37 | +注册 OAuth 提供商时,`authorization_url`、`token_url` 等端点 URL 必须使用 HTTPS scheme,拒绝 HTTP 配置。 |
| 38 | + |
| 39 | +#### X-Forwarded-For / X-Real-IP 校验 |
| 40 | +对 `X-Forwarded-For` 和 `X-Real-IP` 请求头中的 IP 地址进行合法性验证,防止伪造 IP 绕过限流。 |
| 41 | + |
| 42 | +#### CORS 严格来源策略 |
| 43 | +添加 CORS 中间件,按配置的白名单策略控制跨域请求,默认拒绝未授权来源。 |
| 44 | + |
| 45 | +#### auth_introspect IP 级限流 |
| 46 | +`/v1/auth/introspect` 端点新增基于 IP 的独立限流,防止批量枚举 Token 有效性。 |
| 47 | + |
| 48 | +--- |
| 49 | + |
| 50 | +### ⚙️ 配置增强 |
| 51 | + |
| 52 | +#### 数据库连接池大小可配置 |
| 53 | +新增 `DB_POOL_SIZE` 环境变量,允许按部署规模调整数据库连接池大小。 |
| 54 | + |
| 55 | +```env |
| 56 | +DB_POOL_SIZE=20 |
| 57 | +``` |
| 58 | + |
| 59 | +默认值:`5`(开发环境);生产环境建议根据负载调整。 |
| 60 | + |
| 61 | +--- |
| 62 | + |
| 63 | +### 🛡️ 代码健壮性 |
| 64 | + |
| 65 | +#### 消除 `panic!` 调用 |
| 66 | +将 `main.rs` 和 `state.rs` 中遗留的 `panic!` 调用替换为正确的错误传播(`?` 和 `Result`),避免服务在异常情况下直接崩溃。 |
| 67 | + |
| 68 | +#### 第三方导入批次大小限制 |
| 69 | +`/v1/admin/users/migrations/import` 接口新增批次大小上限校验,防止超大批次请求造成服务压力。 |
| 70 | + |
| 71 | +--- |
| 72 | + |
| 73 | +## 新增环境变量 |
| 74 | + |
| 75 | +| 变量 | 说明 | 默认值 | |
| 76 | +|------|------|------| |
| 77 | +| `DB_POOL_SIZE` | 数据库连接池大小 | `5` | |
| 78 | + |
| 79 | +--- |
| 80 | + |
| 81 | +## 升级指南 |
| 82 | + |
| 83 | +### 从 1.0.x 升级 |
| 84 | + |
| 85 | +1. **更新服务镜像** 至 `v1.1.0`。 |
| 86 | +2. **重置客户端密钥**:由于密钥存储格式从明文改为 bcrypt 哈希,需通过管理接口重新设置所有客户端的 `client_secret`,或在数据库中使用 bcrypt 哈希值手动更新。 |
| 87 | +3. **确认 Redis 可用性**:生产环境若之前 Redis 偶尔不可用而服务仍正常运行,1.1.0 起将返回错误。确保 Redis 在生产环境中稳定运行。 |
| 88 | +4. **可选**:按需配置 `DB_POOL_SIZE`。 |
| 89 | +5. 重启服务,数据库迁移将自动执行。 |
| 90 | + |
| 91 | +--- |
| 92 | + |
| 93 | +## 兼容性说明 |
| 94 | + |
| 95 | +- API 接口无破坏性变更,客户端无需修改调用方式。 |
| 96 | +- 密码复杂度新规则仅在注册和修改密码时触发,**不影响现有用户登录**。 |
| 97 | +- `DB_POOL_SIZE` 为可选配置,不设置时行为与 1.0.x 一致。 |
| 98 | + |
| 99 | +--- |
| 100 | + |
| 101 | +## 1.1.0 已知限制(延续自 1.0) |
| 102 | + |
| 103 | +以下内容不阻塞 1.1.0 发布,计划在后续版本中完善: |
| 104 | + |
| 105 | +- 不支持多把 RSA 密钥并行发布(双 key 平滑过渡) |
| 106 | +- 不支持自动密钥轮换流程 |
| 107 | +- JWKS 缓存刷新依赖下游系统主动拉取 |
0 commit comments