Rate Limiting
Para garantir a estabilidade e proteger funcionalidades sensíveis contra abuso, o Draft Auth implementa Rate Limiting utilizando o Upstash Redis (ou outro Redis compatível) e a biblioteca @upstash/ratelimit.
Implementação
Section titled “Implementação”A lógica de configuração do Rate Limiter está no módulo apps/api/src/libs/rate-limit.ts. Este módulo:
- Inicializa um cliente Redis usando as variáveis
env.REDIS_URLeenv.REDIS_TOKEN. - Define duas instâncias de
Ratelimitcom cache efêmero em memória e algoritmo Sliding Window:- IP Limiter (
ipRateLimiterInstance): Limita por endereço IP, permitindo 3 requisições por janela de 60 segundos. Usa o prefixoratelimit_ipno Redis. - Email Limiter (
emailRateLimiterInstance): Limita por endereço de email, permitindo 3 requisições por janela de 10 minutos. Usa o prefixoratelimit_emailno Redis.
- IP Limiter (
- Exporta duas funções auxiliares:
limitIpRate(identifier: string): Verifica o limite para um IP.limitEmailRate(identifier: string): Verifica o limite para um email.- Importante: Estas funções retornam apenas
{ success: boolean, remaining: number }. Em caso de erro na comunicação com o Redis, elas retornam{ success: true, remaining: 0 }por padrão (devido aotry/catch), o que significa que o rate limit pode ser bypassado se o Redis estiver indisponível.
Uso Atual
Section titled “Uso Atual”- O Rate Limiting é aplicado exclusivamente dentro da função
sendCodedoPasswordProvider(no arquivolibs/auth.ts). Ele não é aplicado automaticamente a outras rotas da API como/api/manage,/api/serviceou/api/setup. - As funções
limitIpRateelimitEmailRatesão injetadas no contexto Hono para cada requisição. - A função
sendCode:- Obtém as funções
limitIpRateelimitEmailRatedo contexto. - Chama
limitIpRatecom o IP do requisitante. - Chama
limitEmailRatecom o email fornecido. - Verifica o resultado
successde ambas as chamadas. - Se qualquer uma falhar (
!success), lança umaHTTPExceptioncom status 429 (Too Many Requests), impedindo o envio do email.
- Obtém as funções
Configuração
Section titled “Configuração”Requer a configuração das variáveis de ambiente do Redis:
REDIS_URLREDIS_TOKEN
Veja também:
- Variáveis de Ambiente (Seção Redis)
- Configuração de Email (Onde o rate limit é aplicado)