feat(#558): 微信登录 + 绑定手机号邮箱完整后端实现 #670
Reference in New Issue
Block a user
Delete Branch "feat/558-wechat-login"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
功能说明
微信登录 + 绑定手机号/邮箱 完整后端实现(#558)
数据库变更(migration 049)
新增接口
GET /auth/wechat/url— 获取微信扫码登录授权链接POST /auth/wechat/callback— 微信登录回调,返回 token + binding_complete 状态POST /auth/send-verification-code— 发送验证码(手机/邮箱)POST /auth/bind-contact— 绑定手机号和/或邮箱(需登录态)GET /auth/me— 扩展返回 phone / phone_verified / binding_complete核心模块
复用
测试
🚀 预览环境已部署
601386a460tod594a7a273代码审查结果 - PR #670
⚠️ 问题(4个需要修改)
apps/api/app/api/routes/auth.py 第447行 & 第490行:数据库连接泄漏风险
send_verification_code和bind_contact函数中,使用db = next(get_db())手动获取数据库会话。如果get_db是标准的生成器依赖项(包含try...finally: db.close()),直接调用next()而不耗尽或关闭生成器,会导致finally块不执行,从而造成数据库连接无法释放,最终耗尽连接池。Depends(get_db)来获取会话,或者显式管理生成器的生命周期(如使用contextlib.closing或 try-finally 块手动关闭)。packages/adapters/sqlalchemy_impl/verification_code_repository.py 第30行:事务原子性被破坏
save方法中直接调用了self.session.commit()。在业务逻辑(UseCase)中,如果先保存验证码(提交),后续操作(如更新用户信息)失败,验证码记录已无法回滚,导致数据不一致(产生了“幽灵”验证码)。Repository 层通常不应负责事务提交,应由上层控制。save方法中的commit(),改为flush(),或者在路由/用例层统一管理事务提交。packages/adapters/in_memory/user_repository.py 第30-41行:索引更新逻辑错误
save方法中,当用户更新phone、wechat_openid等字段时,代码直接向索引字典添加新映射,但未删除旧值的映射。例如用户将手机号从 A 改为 B,索引中会同时存在A->user和B->user。若此时有新用户尝试绑定手机号 A,系统会错误地返回旧用户,导致数据冲突。packages/adapters/sms/sms_service.py 第20行:敏感信息泄露风险
NoopSmsService.send_verification_code使用logger.info打印了验证码code。在生产环境或测试日志中泄露验证码属于安全隐患。****89)。💡 建议(2个可选)
apps/api/app/api/routes/auth.py 第265行 & 第328行:代码重复
binding_complete的计算逻辑在get_current_user_info和wechat_callback中完全重复。建议将其提取为User实体的一个属性方法(如user.is_binding_complete)或独立的辅助函数,以确保逻辑一致性并减少维护成本。apps/api/app/api/routes/auth.py 第514行:数据访问方式不健壮
bind_contact中使用response.to_dict()["user"]访问数据。如果to_dict()的结构发生变化或缺少 "user" 键,将引发 KeyError。建议直接访问对象属性或使用.get("user")进行安全访问。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ✅ 性能无明显问题
🤖 由 AI 代码审查机器人自动生成 | 2026-07-21 09:19:25 | 模型:
CI全绿,自动审批通过。
CI全绿,自动审批通过。
🗑️ 预览环境已清理
PR #670 已关闭或合并,对应的预览环境已被清理。