Skip to content

[A02][Draft] 认证兼容:原子改密与会话轮换、OAuth 双因素防护 - #877

Merged
LIghtJUNction merged 11 commits into
wip/rust-core-go-extensionsfrom
fix/a02-auth-guards-20261012
Oct 12, 2026
Merged

LIghtJUNction merged 11 commits into
wip/rust-core-go-extensionsfrom
fix/a02-auth-guards-20261012

Conversation

@LIghtJUNction

@LIghtJUNction LIghtJUNction commented Oct 12, 2026 •

Copy link
Copy Markdown
Collaborator

范围

继续更新同一 A02 PR,目标仍是 wip/rust-core-go-extensions,不是 main;未合并、未部署。完整 A02 尚未完成。

已提交

  1. 共用会话签发入口检查本地双因素要求,Google 身份不能替代第二因素。保留原生 Google 的 state、nonce、PKCE、签名与回调绑定检查。
  2. 未实现邮箱验证时明确拒绝非空邮箱注册,而不是成功后丢弃邮箱。无邮箱注册保持不变;A10 仍需核对客户端提示。
  3. 369a4cce4b9ae0ff5324423343def0197ee9f53f 修正此前 CI 的两份测试文件格式。
  4. e8c5f4a2be3c5bc0ebb2188426fbce85cb846693 接通浏览器 PUT /api/user/self 密码修改:原密码验证、密码写入、用户凭据代际推进、当前会话的 access/refresh 轮换及审计在同一事务完成。失败回滚;其他旧会话和本人签发的旧 API Key 因代际不符失效,不触碰其他用户身份或资金。

改密代码只增加 A02 的 browser/password 叶模块并修改现有 profile handler。没有修改共享 DDL、配置、Cargo、权限脚本、Web/CLI 或 Git 子模块指针。

A02 password-change v1 客户端合同

  • 请求:PUT /api/user/self;当前浏览器 Authorization: Bearer ...;规范同源 Origin。可带 X-Auth-Session,提供时必须与当前会话一致。
  • JSON:original_password、password;可选 display_name。新密码沿用浏览器 8–20 字符要求,密码不裁剪。未知字段、客户端指定 user_id、混合密码和偏好更新均拒绝。
  • 成功:原有 success/data 包装,返回新的 access_token、token_type、access_expires_at、session 和 user;同一 sid;设置新的 HttpOnly/SameSite=Strict refresh cookie;正式 HTTPS 配置仍要求 Secure。响应不缓存。
  • 当前会话保留原 created_at、绝对过期时间、每周退出策略、IP 和设备信息;不通过改密延长生命周期。改密前 refresh 不设宽限窗口。
  • 仅 API Key、仅 refresh cookie、native-only bearer 都不能调用该浏览器改密流程。它不是找回密码或双因素恢复接口。
  • 当前权限、旧密码 hash 与会话必须在事务内重新检查。被竞争操作持有的必要行锁使用 NOWAIT,返回冲突而不是等待形成锁环。客户端不得自动重试改密。
  • 提交结果未知时不得显示成功或自动重发;重新登录确认。尚未声称已完成 COMMIT ACK 丢失注入测试。

实际验证

  • 旧提交 64f75d5 的真实 CI:432 通过、0 失败、3 跳过;格式失败。旧结果只作为旧输入证据。
  • 格式修复 369a4cc 的 MK-01 身份与团队检查 已全部成功。
  • 改密提交 e8c5f4a 的 MK-01 检查 与 微内核检查 已触发,结果尚在核验,暂不标通过。
  • 新增五项 SQLx/真实隔离 PostgreSQL 测试:实际 HTTP 改密、本人旧浏览器/native/key 代际失效与他人隔离、非法输入/错误密码/错误身份不写入、审计失败全事务回滚、并发一次成功、锁竞争拒绝及当前 MFA 策略拒绝。

剩余 A02

完整双因素挑战/TOTP/恢复码、Passkey、邮箱验证与找回密码、其他 OAuth provider 与 OAuth2 授权服务器、HumanGrant Rust 持久授权/撤销、历史 API Key 导入及完整客户端联合验收仍未完成。真实浏览器、独立 CLI、真实外部 OAuth provider、生产环境均未作为本轮测试对象。S11 仍需最终组合验证;不能因本 PR 部分检查通过关闭完整 A02。

对照 main 改密来源:3948a0a1ee1cefdd016a7aa45a11851545bb4b85 的 apps/api-go/controller/user.go::UpdateSelf 及 Web UpdateUserRequest。没有将整条 main 或旧 Go 认证写入搬回 Rust 核心。

本轮推送:原生会话改密(尚未通过新提交 CI)

在原有浏览器改密实现的基础上,补充 Rust Core 原生 POST /core/v1/auth/password。仅接受有效 native session、原密码与新密码;API Key、旧浏览器会话绑定及未知 JSON 字段不能借此取得新会话。密码写入、auth_version 更新、新 session 签发、旧 session 撤销及审计均在同一数据库事务中提交;旧凭据列表显示版本失效。

新增 8 项 SQLx 测试,覆盖合法请求、参数拒绝、旧会话及 Key 失效、并发只能完成一次、策略与密码哈希变更、锁冲突、审计回滚及旧 bcrypt 验证迁移。保留原有浏览器改密模块和已有 5 项相关测试,不覆盖它们。

新增提交:061493f(Core 原生改密)、726534b(HTTP 路由)、e8e8af8(测试)。补丁的三个 Git blob SHA 已从远端核对。这是 Draft,新增代码未在本地编译或运行 PostgreSQL;不能复用上一版 CI 通过结果。参见 最新 CI。完整 A02 的第二因素、Passkey、OAuth2、HumanGrant 和独立 CLI 联合验收仍待后续完成。

Copy link
Copy Markdown
Collaborator Author

A10 消费端进展:#880 的 9ebd18e9b9134f3e90971758c663fb4b644c6a68 已为 AUTH_REGISTRATION_FEATURE_UNAVAILABLE 增加固定文案映射,兼容直接响应体、嵌套 error.code 及 HTTP error.response.data。没有移除邮箱/验证/推荐参数来绕过拒绝,没有改注册表单输入,也没有自动重发注册。

4 项错误映射测试在 Node 22.16.0 隔离环境通过;两个无关错误处理依赖被替代,因此这不是完整注册页面、HTTP 拦截器或真实后端测试。项目固定 Bun 的前端测试和与本 PR 的实际联合验证仍待执行。此回报只确认客户端处理了该明确错误码,不确认 A02/A10 已完成。

@LIghtJUNction LIghtJUNction changed the title [A02][Draft] 认证防护:OAuth 会话双因素门禁与邮箱注册显式拒绝 [A02][Draft] 认证兼容:原子改密与会话轮换、OAuth 双因素防护 Oct 12, 2026
LIghtJUNction added a commit that referenced this pull request Oct 12, 2026
Ports scoped #877 identity work through e8e8af8, authored by LIghtJUNction. Denies OAuth MFA bypass and unsupported email registration; preserves native/browser lifetimes and rejects wrong-password refresh replay. Adds browser/native separation and refresh-race regressions. 42 targeted tests and Clippy passed on existing Rust 1.98 with independent synthetic PostgreSQL; pinned Rust 1.99 remains blocked.
@LIghtJUNction
LIghtJUNction merged commit 07a6cbf into wip/rust-core-go-extensions Oct 12, 2026
0 of 2 checks passed
@LIghtJUNction

Copy link
Copy Markdown
Collaborator Author

已按本轮授权合入微服务主线,GitHub 已读回 MERGED。合并提交 07a6cbf 保留 90f7810 的已验证实现和额外回归,不覆盖后续工作。认证 42 项(39 真实合成 PG、3 纯测试)、定向 Clippy/格式检查通过;实际 Rust 为 1.98,固定 1.99 因现有安装不完整仍未验证。此合并仅接受本 PR 的窄实现,不表示完整 A02、HumanGrant、管理员/MFA、真实用户浏览器或整站验收完成;未部署。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant