Documentation
¶
Overview ¶
Package middlewares fornece middlewares de autenticação e autorização para APIs Focado em JWT (JSON Web Tokens) usando a biblioteca go-chi/jwtauth
Index ¶
- Variables
- func DynamicVerifier(authFunc func() *jwtauth.JWTAuth) func(http.Handler) http.Handler
- func OptionalAuth(auth *jwtauth.JWTAuth) func(http.Handler) http.Handler
- func RateLimit() func(http.Handler) http.Handler
- func RateLimitWithWait() func(http.Handler) http.Handler
- func RequireAuth() func(http.Handler) http.Handler
- func StaticVerifier(auth *jwtauth.JWTAuth) func(http.Handler) http.Handler
- func StrictRateLimit() func(http.Handler) http.Handler
- type RateLimiter
Constants ¶
This section is empty.
Variables ¶
var ( // DefaultRateLimiter: configuração balanceada para uso geral // 10 requests por segundo, burst de 20, limpeza a cada minuto // Adequado para APIs REST comuns DefaultRateLimiter = NewRateLimiter(10, 20, time.Minute*1) // StrictRateLimiter: configuração mais restritiva para endpoints sensíveis // 2 requests por segundo, burst de 5, limpeza a cada minuto // Adequado para endpoints de login, cadastro, operações críticas StrictRateLimiter = NewRateLimiter(2, 5, time.Minute*1) )
Instâncias globais de rate limiter pré-configuradas
Functions ¶
func DynamicVerifier ¶
DynamicVerifier cria um middleware de autenticação JWT dinâmico Permite que a configuração JWT seja obtida dinamicamente a cada requisição
Funcionalidade: 1. Obtém a configuração JWT através da função authFunc 2. Cria um verificador JWT baseado nesta configuração 3. Aplica verificação e autenticação do token 4. Se válido: passa para o próximo handler 5. Se inválido: retorna erro de autenticação
Parâmetros:
- authFunc: função que retorna *jwtauth.JWTAuth com configuração atual Útil quando a chave JWT, algoritmo ou outras configurações podem mudar dinamicamente (ex: rotação de chaves, multi-tenant, etc.)
Retorna:
- Função middleware que pode ser usada na cadeia de middlewares
Exemplo de uso:
func getJWTAuth() *jwtauth.JWTAuth {
return jwtauth.New("HS256", []byte(getCurrentSecretKey()), nil)
}
router.Use(middlewares.DynamicVerifier(getJWTAuth))
Diferença do verifier estático:
- Verifier estático: configuração fixada na inicialização
- DynamicVerifier: configuração obtida a cada requisição
func OptionalAuth ¶ added in v1.0.157
OptionalAuth middleware que permite acesso com ou sem autenticação Token JWT é verificado se presente, mas não é obrigatório
Funcionalidade: 1. Se token presente e válido: adiciona informações do usuário ao contexto 2. Se token presente mas inválido: retorna erro 401 3. Se token ausente: permite acesso (contexto sem informações de usuário)
Útil para endpoints que: - Funcionam para usuários anônimos e autenticados - Personalizam resposta baseada na autenticação - APIs públicas com recursos extras para usuários logados
Parâmetros:
- auth: instância *jwtauth.JWTAuth para verificação
Exemplo de uso:
router.Use(middlewares.OptionalAuth(jwtAuth))
router.Get("/posts", func(w http.ResponseWriter, r *http.Request) {
_, claims, _ := jwtauth.FromContext(r.Context())
if claims != nil {
// Usuário autenticado - mostrar posts privados também
} else {
// Usuário anônimo - mostrar apenas posts públicos
}
})
func RateLimit ¶
RateLimit retorna um middleware de rate limiting com configuração padrão Usa DefaultRateLimiter (10 req/seg, burst 20) Rejeita requests excessivos com status 429
Exemplo de uso:
router.Use(middlewares.RateLimit())
Retorna função que pode ser usada como middleware
func RateLimitWithWait ¶
RateLimitWithWait retorna um middleware que aguarda em vez de rejeitar Usa DefaultRateLimiter mas com comportamento de espera Pode causar latência alta se muitos clientes estiverem aguardando
Exemplo de uso:
uploadRouter.Use(middlewares.RateLimitWithWait())
Retorna função que pode ser usada como middleware
func RequireAuth ¶ added in v1.0.157
RequireAuth middleware que exige autenticação válida Complementa os verificadores, garantindo que o token seja válido
Funcionalidade: 1. Verifica se o token JWT foi validado pelos middlewares anteriores 2. Se token é válido: permite acesso ao endpoint 3. Se token inválido/ausente: retorna erro 401 Unauthorized
Deve ser usado APÓS um verificador (StaticVerifier ou DynamicVerifier)
Exemplo de uso:
router.Use(middlewares.StaticVerifier(jwtAuth))
router.Use(middlewares.RequireAuth())
// Ou em grupo específico:
router.Route("/api/protected", func(r chi.Router) {
r.Use(middlewares.StaticVerifier(jwtAuth))
r.Use(middlewares.RequireAuth())
r.Get("/user", getUserHandler)
})
Retorna:
- Função middleware que pode ser usada na cadeia de middlewares
func StaticVerifier ¶ added in v1.0.157
StaticVerifier cria um middleware de autenticação JWT com configuração fixa Usa uma configuração JWT estática definida na inicialização da aplicação
Funcionalidade: 1. Usa configuração JWT pré-definida (não muda durante execução) 2. Aplica verificação e autenticação do token 3. Mais performático que DynamicVerifier (sem overhead de função)
Parâmetros:
- auth: instância *jwtauth.JWTAuth com configuração fixa
Retorna:
- Função middleware que pode ser usada na cadeia de middlewares
Exemplo de uso:
jwtAuth := jwtauth.New("HS256", []byte("secret-key"), nil)
router.Use(middlewares.StaticVerifier(jwtAuth))
Use quando:
- Chave JWT é fixa durante toda execução da aplicação
- Performance é crítica (evita overhead de função dinâmica)
- Configuração simples sem necessidade de mudanças em runtime
func StrictRateLimit ¶
StrictRateLimit retorna um middleware de rate limiting mais restritivo Usa StrictRateLimiter (2 req/seg, burst 5) Adequado para endpoints sensíveis (login, registro, etc.)
Exemplo de uso:
authRouter.Use(middlewares.StrictRateLimit())
Retorna função que pode ser usada como middleware
Types ¶
type RateLimiter ¶
type RateLimiter struct {
// contains filtered or unexported fields
}
RateLimiter gerencia rate limiters por IP
func NewRateLimiter ¶
func NewRateLimiter(requestsPerSecond float64, burstSize int, cleanupInterval time.Duration) *RateLimiter
NewRateLimiter cria um novo rate limiter personalizado Parâmetros:
- requestsPerSecond: número de requests permitidas por segundo (ex: 10.0)
- burstSize: número máximo de requests simultâneas permitidas (ex: 20)
- cleanupInterval: intervalo para limpeza de limiters inativos (ex: 1 minuto)
Retorna uma instância configurada de RateLimiter Exemplo: NewRateLimiter(5.0, 10, time.Minute) = 5 req/seg, burst de 10, cleanup a cada minuto
func (*RateLimiter) RateLimitMiddleware ¶
func (rl *RateLimiter) RateLimitMiddleware(next http.Handler) http.Handler
RateLimitMiddleware middleware que aplica rate limiting por IP e rejeita requests excessivos Comportamento: se o limite for excedido, retorna erro 429 (Too Many Requests) imediatamente
Como funciona: 1. Extrai o IP do cliente 2. Obtém/cria o rate limiter para esse IP 3. Verifica se o request é permitido 4. Se sim: passa para o próximo handler 5. Se não: retorna erro 429
Parâmetros:
- next: próximo handler na cadeia de middlewares
Retorna http.Handler que pode ser usado na cadeia de middlewares
func (*RateLimiter) RateLimitWithWait ¶
func (rl *RateLimiter) RateLimitWithWait(next http.Handler) http.Handler
RateLimitWithWait middleware que aplica rate limiting mas aguarda em vez de rejeitar Comportamento: se o limite for excedido, aguarda até que seja possível processar o request
Como funciona: 1. Extrai o IP do cliente 2. Obtém/cria o rate limiter para esse IP 3. Aguarda até que um "token" esteja disponível (respeitando timeout do contexto) 4. Se timeout: retorna erro 408 (Request Timeout) 5. Se conseguir: passa para o próximo handler
Parâmetros:
- next: próximo handler na cadeia de middlewares
Retorna http.Handler que pode ser usado na cadeia de middlewares Cuidado: pode causar requests lentos se muitos clientes estiverem aguardando