Skip to content
This repository was archived by the owner on Jul 10, 2026. It is now read-only.

Sprint 1 (backend): throttle de login por IP em Redis (TKT-017) - #109

Merged
danzeroum merged 1 commit into
mainfrom
claude/optimistic-mendel-cwuuno
Jun 21, 2026
Merged

Sprint 1 (backend): throttle de login por IP em Redis (TKT-017)#109
danzeroum merged 1 commit into
mainfrom
claude/optimistic-mendel-cwuuno

Conversation

@danzeroum

Copy link
Copy Markdown
Owner

TKT-017 — Rate limiter (login) → Redis

Torna o throttle de brute-force de login distribuído (Redis), para a API rodar stateless com docker compose up --scale api=N sem cada réplica multiplicar o limite.

Mudanças

  • novo módulo throttle.rs: LoginThrottle sobre redis::aio::ConnectionManager, com fallback automático em memória quando REDIS_URL está ausente/indisponível (fail-open — o nginx já faz rate-limit por IP na borda)
  • janela fixa via INCR+EXPIRE (login_fail:<ip>); API is_blocked / record_failure / clear
  • AppState: login_attempts (DashMap)login_throttle; main.rs conecta o Redis best-effort no startup
  • remove middleware/rate_limiter.rsPerKeyRateLimiter morto (nunca declarado no mod tree nem usado; o limiter real por API key vive no api-public, será migrado para Redis no Sprint 5 quando montado no api)

Verificação local

  • cargo build -p api
  • cargo clippy -p api -- -D warnings ✓ (limpo)
  • cargo test -p api throttle2/2 — memória e Redis (contra Redis local)

🤖 Generated with Claude Code


Generated by Claude Code

Move o throttle de brute-force de login do DashMap in-process para Redis,
tornando-o distribuido (varias replicas da API compartilham o contador) —
requisito para rodar a API stateless com `--scale api=N`.

- novo modulo `throttle.rs`: LoginThrottle (Redis ConnectionManager) com
  fallback automatico em memoria quando REDIS_URL ausente/indisponivel
  (fail-open; nginx ja faz rate-limit por IP na borda)
- janela fixa via INCR+EXPIRE (login_fail:<ip>); is_blocked/record_failure/clear
- AppState: login_attempts(DashMap) -> login_throttle; main.rs conecta o Redis
  best-effort no startup
- remove `middleware/rate_limiter.rs` (PerKeyRateLimiter morto — nunca era
  declarado no mod tree nem usado; o limiter real por API key vive no api-public)

Verificacao local: cargo build OK; clippy -D warnings limpo; testes do throttle
(memoria + Redis local) passam (2/2).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AcsaeS7c9zJ4vkNtxqBcnc
@danzeroum
danzeroum merged commit 4ec9c85 into main Jun 21, 2026
1 check passed
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants