fix(#558): 微信登录3个后端修复 - 验证码500 + 绑定500 + state校验 #684

Merged
xiaoxia merged 1 commits from fix/558-wechat-login-fixes into develop 2026-07-21 17:51:49 +08:00
Owner

修复内容

1. /auth/send-verification-code 500

  • 根因from app.dependencies import get_db 函数名错误,正确名称为 get_db_session
  • 影响:邮箱+手机验证码发送全部挂

2. /auth/bind-contact 500

  • 根因:同上,get_db 导入错误
  • 影响:手机号/邮箱绑定接口挂

3. 微信回调接口增加 state 校验(防 CSRF)

  • 新增 MemoryStateStore,state 有效期 10 分钟
  • state 一次性使用,校验通过即消费
  • 前端已生成并传递 state,后端此前只接收不校验,现在完整校验
  • 多实例部署时可替换为 Redis 实现

测试

  • 42 个相关单测全部通过
  • 新增 3 个 state 校验专项测试:无效 state 拒绝 / 一次性使用 / 空 state 拒绝
## 修复内容 ### 1. /auth/send-verification-code 500 - **根因**:`from app.dependencies import get_db` 函数名错误,正确名称为 `get_db_session` - 影响:邮箱+手机验证码发送全部挂 ### 2. /auth/bind-contact 500 - **根因**:同上,`get_db` 导入错误 - 影响:手机号/邮箱绑定接口挂 ### 3. 微信回调接口增加 state 校验(防 CSRF) - 新增 `MemoryStateStore`,state 有效期 10 分钟 - state 一次性使用,校验通过即消费 - 前端已生成并传递 state,后端此前只接收不校验,现在完整校验 - 多实例部署时可替换为 Redis 实现 ## 测试 - 42 个相关单测全部通过 - 新增 3 个 state 校验专项测试:无效 state 拒绝 / 一次性使用 / 空 state 拒绝
xiaoxia added 1 commit 2026-07-21 14:40:22 +08:00
fix(#558): 微信登录3个后端修复
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m3s
AI Code Review / AI Code Review (pull_request) Successful in 3m29s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 4m47s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 4m52s
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
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 Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 6s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Unit Tests (pull_request) Successful in 22s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 1m2s
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Successful in 1m19s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m15s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 24s
f67095ade6
- 修复 /auth/send-verification-code 500: get_db → get_db_session
- 修复 /auth/bind-contact 500: get_db → get_db_session
- 微信回调接口增加 state 校验(防 CSRF),内存 state store,10分钟有效期,一次性使用

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #684 | | 预览链接 | [https://pr-684.preview.xiaoxiajianji.com](https://pr-684.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
Collaborator

代码审查结果 - PR #684

⚠️ 问题(1个需要修改)

  1. apps/api/app/api/routes/auth.py (send_verification_code 和 bind_contact 函数):数据库连接资源泄露风险。代码中使用 db = next(get_db_session()) 手动获取数据库会话。如果 get_db_session 是标准的生成器依赖(包含 yield dbfinally: db.close()),直接调用 next() 仅获取会话对象,函数结束后生成器未被耗尽或关闭,导致 finally 块中的 db.close() 永远不会执行。这将造成数据库连接泄露,高并发下会导致连接池耗尽服务不可用。

💡 建议(1个可选)

  1. packages/application/auth/wechat_oauth_service.py:在异步环境(FastAPI)中使用 threading.Lock 会阻塞事件循环。虽然 WechatOAuthService 是同步类,但在异步路由中调用其方法(持有锁时)会阻塞整个事件循环,降低并发性能。建议将 MemoryStateStore 改为异步实现(使用 asyncio.Lock),或者确保该服务在线程池中运行。

格式检查通过 | 逻辑审查需修改 | ⚠️ 建议关注性能


🤖 由 AI 代码审查机器人自动生成 | 2026-07-21 14:43:51 | 模型:

## 代码审查结果 - PR #684 ### ⚠️ 问题(1个需要修改) 1. **apps/api/app/api/routes/auth.py (send_verification_code 和 bind_contact 函数)**:数据库连接资源泄露风险。代码中使用 `db = next(get_db_session())` 手动获取数据库会话。如果 `get_db_session` 是标准的生成器依赖(包含 `yield db` 和 `finally: db.close()`),直接调用 `next()` 仅获取会话对象,函数结束后生成器未被耗尽或关闭,导致 `finally` 块中的 `db.close()` 永远不会执行。这将造成数据库连接泄露,高并发下会导致连接池耗尽服务不可用。 ### 💡 建议(1个可选) 1. **packages/application/auth/wechat_oauth_service.py**:在异步环境(FastAPI)中使用 `threading.Lock` 会阻塞事件循环。虽然 `WechatOAuthService` 是同步类,但在异步路由中调用其方法(持有锁时)会阻塞整个事件循环,降低并发性能。建议将 `MemoryStateStore` 改为异步实现(使用 `asyncio.Lock`),或者确保该服务在线程池中运行。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-21 14:43:51 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia merged commit 9f69fde30b into develop 2026-07-21 17:51:49 +08:00

🗑️ 预览环境已清理

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

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

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