fix(#1718/#1714): 微信回调纠错 + 上传失败可观测性 + 哈希性能 + 昵称不预填 #1723

Merged
xiaoxia merged 5 commits from fix/1718-callback-error-observability into develop 2026-09-05 22:52:50 +08:00
Owner

改动

1. 微信回调纠错(#1718)

  • 删除 localStorage wechat_state 前置校验:state 防 CSRF 由后端 state store 一次性消费兜底;前端这层在微信内打开、跨浏览器等场景本地无 state,会误杀正常回调(登录回调 WechatCallback 与绑定回调 WechatBindCallback 同步处理)
  • 错误透传:回调 catch 统一走新增的 api/errors.ts getErrorMessage(),提取 axios response.data.detail(含 FastAPI 422 数组、嵌套对象),不再吞成「微信登录失败,请重试」
  • 处理微信重定向 error 参数(用户拒绝授权 error=access_denied),页面展示真实原因
  • 登录按钮防连点wechatStartingRef 同步守卫,wechatLoading 期间不重复请求授权 URL(连点两次后一次 state 覆盖前一次导致回调失败)

2. 上传失败可观测性(#1714)

  • 失败卡片完整展示:失败阶段(准备上传/文件传输/确认入库)+ HTTP 状态码 + OSS XML 错误 Code/Message(XHR 已解析)+ 后端 detail,不再只显示「上传失败」;complete 阶段另附「重试不会重新上传文件」安全提示
  • getOrCreateDefaultProject() 失败包装为独立明确提示「初始化默认项目失败,无法开始上传:…」
  • toast 与 axios 拦截器全局提示去重(__msgShown),OSS XHR 错误不经 axios 仍会弹 toast

3. 大文件哈希性能(#1714)

  • 全量哈希阈值 256MB → 64MB,超过即走头尾抽样(8MB → 16MB 各)+ 文件大小,避免 100~256MB 视频被整文件读进内存导致页面卡死/崩溃

4. 昵称引导页

  • WechatOnboarding 昵称输入框 initialValues.display_name 固定空字符串,不预填微信昵称/占位名,新用户必须自己输入

测试

  • 新增 api/errors.ts、WechatBindCallback 测试;WechatCallback 重写为 8 例(含本地无 state 不误杀、detail 透传、error 重定向);uploadDedup 补抽样路径 slice 断言;useAssetUpload 补 prepare 失败/错误明细断言;WechatOnboarding 补不预填断言
  • 全量 644 通过(139 文件),tsc/eslint/prettier/build 全绿

自测

  • 微信登录失败时页面显示后端具体原因(如授权码过期/state 已消费)
  • 上传失败卡片显示阶段 + HTTP + OSS Code/Message
  • 64MB 以上文件上传前不再整文件读内存
## 改动 ### 1. 微信回调纠错(#1718) - **删除 localStorage wechat_state 前置校验**:state 防 CSRF 由后端 state store 一次性消费兜底;前端这层在微信内打开、跨浏览器等场景本地无 state,会误杀正常回调(登录回调 `WechatCallback` 与绑定回调 `WechatBindCallback` 同步处理) - **错误透传**:回调 catch 统一走新增的 `api/errors.ts getErrorMessage()`,提取 axios `response.data.detail`(含 FastAPI 422 数组、嵌套对象),不再吞成「微信登录失败,请重试」 - 处理微信重定向 error 参数(用户拒绝授权 `error=access_denied`),页面展示真实原因 - **登录按钮防连点**:`wechatStartingRef` 同步守卫,wechatLoading 期间不重复请求授权 URL(连点两次后一次 state 覆盖前一次导致回调失败) ### 2. 上传失败可观测性(#1714) - 失败卡片完整展示:**失败阶段**(准备上传/文件传输/确认入库)+ **HTTP 状态码** + **OSS XML 错误 Code/Message**(XHR 已解析)+ 后端 detail,不再只显示「上传失败」;complete 阶段另附「重试不会重新上传文件」安全提示 - `getOrCreateDefaultProject()` 失败包装为独立明确提示「初始化默认项目失败,无法开始上传:…」 - toast 与 axios 拦截器全局提示去重(`__msgShown`),OSS XHR 错误不经 axios 仍会弹 toast ### 3. 大文件哈希性能(#1714) - 全量哈希阈值 **256MB → 64MB**,超过即走头尾抽样(**8MB → 16MB** 各)+ 文件大小,避免 100~256MB 视频被整文件读进内存导致页面卡死/崩溃 ### 4. 昵称引导页 - `WechatOnboarding` 昵称输入框 **initialValues.display_name 固定空字符串**,不预填微信昵称/占位名,新用户必须自己输入 ## 测试 - 新增 `api/errors.ts`、WechatBindCallback 测试;WechatCallback 重写为 8 例(含本地无 state 不误杀、detail 透传、error 重定向);uploadDedup 补抽样路径 slice 断言;useAssetUpload 补 prepare 失败/错误明细断言;WechatOnboarding 补不预填断言 - **全量 644 通过**(139 文件),tsc/eslint/prettier/build 全绿 ## 自测 - 微信登录失败时页面显示后端具体原因(如授权码过期/state 已消费) - 上传失败卡片显示阶段 + HTTP + OSS Code/Message - 64MB 以上文件上传前不再整文件读内存
xiaoxia added 1 commit 2026-09-05 20:13:22 +08:00
fix(#1718/#1714): 微信回调state误杀修复+错误透传防连点、上传失败完整可观测、哈希阈值降至64MB
AI Code Review / AI Code Review (pull_request) Successful in 1m55s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 3m1s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m5s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 11m6s
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 2s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 1s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 2m15s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m56s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m56s
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 3m40s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Validate - Style (pull_request) Successful in 3m47s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 17m20s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 1s
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
6f4499afff
- WechatCallback/WechatBindCallback: 删除localStorage state前置校验(后端state store一次性消费兜底,微信内/跨浏览器误杀正常回调);catch透传后端真实detail;处理微信重定向error参数
- Login: 微信登录按钮加ref同步防连点(连点两次state互相覆盖)
- 新增api/errors.ts统一错误提取(axios detail/422数组/状态码/网络超时)
- useAssetUpload: 失败卡片记录失败阶段+HTTP状态码+OSS XML错误明细;getOrCreateDefaultProject失败独立提示;toast与拦截器去重
- UploadQueuePanel: 失败卡片多行展示完整原因(阶段+错误+安全重试提示)
- uploadDedup: 全量哈希阈值256MB→64MB,抽样片段8MB→16MB,避免100~256MB视频整文件读入内存卡死
- WechatOnboarding: 昵称输入框不预填,用户必须自己输入
- 测试: 新增22用例,全量644通过

🚀 预览环境已部署

项目 详情
PR号 #1723
预览链接 https://pr-1723.preview.xiaoxiajianji.com
API环境 staging

💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。

🔄 每次提交新代码后预览环境会自动更新。

🗑️ PR 关闭或合并后,预览环境会自动清理。

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1723 | | 预览链接 | [https://pr-1723.preview.xiaoxiajianji.com](https://pr-1723.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia added 2 commits 2026-09-05 21:29:57 +08:00
chore: 触发CI重新合入检查(rebase develop)
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 2s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 1m54s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 1m53s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m56s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m12s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 2m27s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m49s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 3m33s
AI Code Review / AI Code Review (pull_request) Successful in 6m27s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 10m38s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 18m39s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 4s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
9a0b9c3234
auto-approve-bot approved these changes 2026-09-05 21:32:10 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot approved these changes 2026-09-05 21:32:10 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
xiaoxia added 2 commits 2026-09-05 22:01:49 +08:00
chore: 合入最新develop触发合入检查
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 1s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 1s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 39s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 1m33s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 1m48s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m43s
AI Code Review / AI Code Review (pull_request) Successful in 1m49s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 2m0s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m53s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 4m49s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 10m33s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 24m9s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 3s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 7s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 1m33s
dbfb1e2bcc
Collaborator

【阻塞级判定】

  • 是否存在阻塞级问题:否
  • 阻塞级问题数量:0 个

📊 审查概览

  • 整体评价:通过
  • 建议级问题数量:1 个

🔴 阻塞级问题(必须修复)

💡 改进建议(不阻塞合并)

  1. [apps/web/src/pages/auth/WechatCallback.tsx, WechatBindCallback.tsx] OAuth State 校验逻辑变更确认
    • 具体内容:代码中移除了前端 localStoragestate 的比对校验,改为完全依赖后端的 "state store" 进行一次性消费校验。虽然这解决了“微信内打开/跨浏览器场景无本地 state 导致误杀”的兼容性问题,但削弱了前端的防御深度。
    • 建议:请确保对应的后端接口已严格实现 state 的生成、绑定(与用户会话关联)、一次性消费校验以及过期机制,以防止 CSRF 攻击。在上线前建议进行安全测试,确认伪造回调请求无法绕过验证。

良好实践

  1. 错误处理标准化:新增 apps/web/src/api/errors.ts 统一提取错误信息,兼容 Axios、OSS、普通 Error 等多种场景,显著提升了用户体验和错误排查效率。
  2. 上传性能优化:将全量哈希阈值从 256MB 下调至 64MB,并增大抽样片段,有效避免了大文件上传时的页面卡顿和内存溢出风险。
  3. 防重复提交与交互优化Login.tsx 中使用 useRef 实现了微信登录的防连点保护,比单纯依赖 state 更可靠。
  4. 测试覆盖充分:针对去重逻辑、上传阶段错误展示、OAuth 回调流程均补充了单测,特别是覆盖了边界条件(如 64MB 阈值处的行为)。

格式检查通过 | 逻辑审查通过 | 性能优化良好


🤖 由 AI 代码审查机器人自动生成 | 2026-09-05 14:03:39 | 模型:

### 【阻塞级判定】 - 是否存在阻塞级问题:否 - 阻塞级问题数量:0 个 ### 📊 审查概览 - 整体评价:通过 - 建议级问题数量:1 个 ### 🔴 阻塞级问题(必须修复) 无 ### 💡 改进建议(不阻塞合并) 1. **[apps/web/src/pages/auth/WechatCallback.tsx, WechatBindCallback.tsx] OAuth State 校验逻辑变更确认** - 具体内容:代码中移除了前端 `localStorage` 对 `state` 的比对校验,改为完全依赖后端的 "state store" 进行一次性消费校验。虽然这解决了“微信内打开/跨浏览器场景无本地 state 导致误杀”的兼容性问题,但削弱了前端的防御深度。 - 建议:请确保对应的后端接口已严格实现 `state` 的生成、绑定(与用户会话关联)、一次性消费校验以及过期机制,以防止 CSRF 攻击。在上线前建议进行安全测试,确认伪造回调请求无法绕过验证。 ### ✅良好实践 1. **错误处理标准化**:新增 `apps/web/src/api/errors.ts` 统一提取错误信息,兼容 Axios、OSS、普通 Error 等多种场景,显著提升了用户体验和错误排查效率。 2. **上传性能优化**:将全量哈希阈值从 256MB 下调至 64MB,并增大抽样片段,有效避免了大文件上传时的页面卡顿和内存溢出风险。 3. **防重复提交与交互优化**:`Login.tsx` 中使用 `useRef` 实现了微信登录的防连点保护,比单纯依赖 state 更可靠。 4. **测试覆盖充分**:针对去重逻辑、上传阶段错误展示、OAuth 回调流程均补充了单测,特别是覆盖了边界条件(如 64MB 阈值处的行为)。 --- ✅ 格式检查通过 | ✅ 逻辑审查通过 | ✅ 性能优化良好 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-09-05 14:03:39 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia merged commit cdcb032e45 into develop 2026-09-05 22:52:50 +08:00

🗑️ 预览环境已清理

PR #1723 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #1723 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Sign in to join this conversation.