Skip to content

feat: 实现用户认证模块——注册/登录/JWT/验证码/限流 #146

Description

@xiaocheny214

背景

Windup 后端此前没有用户体系,所有 API 无鉴权,任何人可操作任何数据。本次在 feat/backend-dev 分支实现了完整的用户认证模块,并修复了由此暴露的一系列权限与基础设施问题。

实现内容

1. 用户注册与登录

  • 邮箱 + 验证码 + 密码注册(POST /auth/register
  • 邮箱 + 密码 + 验证码登录(POST /auth/login
  • 邮箱 + 验证码免密登录,无账号自动注册(POST /auth/login-by-code
  • 刷新 token(POST /auth/refresh
  • 登出(POST /auth/logout

2. JWT 鉴权中间件

  • AuthMiddlewareBaseHTTPMiddleware)统一拦截请求
  • 白名单路径放行(/auth/*/docs/health 等)
  • 验证通过后注入 request.state.current_useridemail
  • access_token 有效期 15 分钟,refresh_token 7 天

3. 邮箱验证码

  • Redis 存储验证码(5 分钟 TTL)+ 发送冷却(60 秒)
  • email_provider 抽象层,可对接任意 SMTP 服务

4. 接口限流中间件

  • RateLimitMiddleware 基于 Redis 滑动窗口
  • 全局 60 次/分钟/IP,敏感接口 10 次/分钟/IP,用户级 120 次/分钟
  • Redis 不可用时优雅降级(跳过限流,不阻断请求)

安全修复(本次同步完成)

问题 修复
middleware 层 BizException 跳过 ExceptionMiddleware,返回 500 而非业务码 改为直接返回 JSONResponse
project API 信任客户端传入的 user_id,可越权操作 从 JWT 取 user_id,加归属校验
generation API 同上 + project_id 无归属校验 同上 + 校验 project 归属
create_character 漏传 name 参数,名称丢失 补传 name=body.name
docker-compose 缺 Redis 服务,认证功能不可用 添加 redis:7-alpine 服务 + REDIS_URL
init.sqlwindup_project 唯一约束,生产可插入重名 补充 UNIQUE (user_id, project_name)

数据模型

windup_user
├── id              BIGINT PK
├── email           VARCHAR(255) UNIQUE
├── password_hash   VARCHAR(255)
├── nickname        VARCHAR(255)
├── email_verified_at TIMESTAMPTZ
├── status          SMALLINT (0=正常, 1=封禁)
├── last_login_at   TIMESTAMPTZ
├── create_at       TIMESTAMPTZ
└── update_at       TIMESTAMPTZ

测试覆盖

  • test_user_service.py:22 个用例,覆盖注册/登录/验证码/登出/刷新/改密/限流
  • test_project_api.py:9 个用例,覆盖 CRUD + 权限归属
  • test_character_api.py:3 个用例,覆盖命名持久化

关联

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions