middlewares

package
v1.0.161 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 28, 2026 License: MIT Imports: 6 Imported by: 0

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

Constants

This section is empty.

Variables

View Source
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

func DynamicVerifier(authFunc func() *jwtauth.JWTAuth) func(http.Handler) http.Handler

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

func OptionalAuth(auth *jwtauth.JWTAuth) func(http.Handler) http.Handler

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

func RateLimit() func(http.Handler) http.Handler

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

func RateLimitWithWait() func(http.Handler) http.Handler

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

func RequireAuth() func(http.Handler) http.Handler

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

func StaticVerifier(auth *jwtauth.JWTAuth) func(http.Handler) http.Handler

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

func StrictRateLimit() func(http.Handler) http.Handler

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

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL