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 个用例,覆盖命名持久化

关联

Activity

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

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