0Pricing
Go Academy · Lección

Middleware de autenticación y limitación de tasa

Validación de JWT y limitación de tasa mediante token bucket

Middleware de autenticación y limitación de tasa es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.

Middleware de autenticación JWT

Extraiga, analice y valide un JWT del encabezado Authorization:

func JWTAuth(secret []byte) func(http.Handler) http.Handler {
    return func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            header := r.Header.Get("Authorization")
            if !strings.HasPrefix(header, "Bearer ") {
                http.Error(w, "missing token", 401); return
            }
            token := strings.TrimPrefix(header, "Bearer ")
            claims, err := parseJWT(token, secret)
            if err != nil {
                http.Error(w, "invalid token", 401); return
            }
            ctx := context.WithValue(r.Context(), claimsKey{}, claims)
            next.ServeHTTP(w, r.WithContext(ctx))
        })
    }
}

Autenticación mediante API key

Valide una API key del encabezado comparándola con una base de datos o un conjunto en memoria:

func APIKeyAuth(validKeys map[string]bool) func(http.Handler) http.Handler {
    return func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            key := r.Header.Get("X-API-Key")
            if !validKeys[key] {
                http.Error(w, "forbidden", 403); return
            }
            next.ServeHTTP(w, r)
        })
    }
}

Limitador de tasa con token bucket

Utilice golang.org/x/time/rate con un mapa de limitadores por IP:

var limiters sync.Map

func getLimiter(ip string) *rate.Limiter {
    v, _ := limiters.LoadOrStore(ip, rate.NewLimiter(rate.Every(time.Second), 10))
    return v.(*rate.Limiter)
}

Middleware de limitación de tasa

Compruebe el limitador en el middleware y devuelva 429 si se supera el límite:

func RateLimit(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        ip, _, _ := net.SplitHostPort(r.RemoteAddr)
        if !getLimiter(ip).Allow() {
            http.Error(w, "rate limit exceeded", 429); return
        }
        next.ServeHTTP(w, r)
    })
}

Encabezado Retry-After

Incluya un encabezado Retry-After con los segundos que el cliente debe esperar antes de volver a intentarlo:

w.Header().Set("Retry-After", "1")
http.Error(w, "rate limit exceeded", 429)

Control de acceso basado en roles

Después de la autenticación, compruebe los roles del usuario en las claims de context antes de llamar a Next:

func RequireRole(role string) func(http.Handler) http.Handler {
    return func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            claims := claimsFromContext(r.Context())
            if !claims.HasRole(role) {
                http.Error(w, "forbidden", 403); return
            }
            next.ServeHTTP(w, r)
        })
    }
}

Limpieza del limitador

Los limitadores antiguos por IP se acumulan en memoria. Límpielos con una goroutine en segundo plano que elimine las entradas a las que no se haya accedido durante los últimos N minutos.

Limitación de tasa distribuida

Los limitadores en proceso no funcionan entre varias instancias. Utilice Redis y un script de ventana deslizante o de token bucket para aplicar la limitación de tasa distribuida.

429 frente a 503

Devuelva 429 Too Many Requests cuando el cliente individual esté limitado por tasa. Devuelva 503 Service Unavailable cuando todo el servicio esté sobrecargado y descarte carga.

Combinar autenticación y limitación de tasa

Aplíquelas como middlewares independientes en la cadena. Primero la autenticación: limite la tasa solo para los usuarios autenticados y diferéncielos por user ID en lugar de por IP.

Pruebas del middleware de autenticación

Utilice httptest para proporcionar tokens válidos y no válidos, y compruebe que se establezcan los códigos de estado y los valores de context correctos.

Comprobación rápida

¿Qué código de estado HTTP debe devolver un middleware de limitación de tasa cuando un cliente supera su límite?

Resumen: autenticación y limitación de tasa

Puntos clave:

  • Middleware JWT: extraer el token Bearer → analizarlo → asociar las claims a context
  • Limitar la tasa con golang.org/x/time/rate por IP o usuario
  • Devolver 429 y el encabezado Retry-After cuando se supere el límite
  • Distribuida: utilizar Redis para la limitación de tasa entre varias instancias

Preguntas frecuentes

¿La lección «Middleware de autenticación y limitación de tasa» es gratis?

Sí — el texto completo de «Middleware de autenticación y limitación de tasa» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Middleware de autenticación y limitación de tasa»?

Validación de JWT y limitación de tasa mediante token bucket Practicas Go Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Go Academy?

No se requiere experiencia previa. Go Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Middleware de autenticación y limitación de tasa»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Go Academy?

Sí. Cada lección de Go Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Fundamentos de la cadena de middleware HTTP
  2. Middleware de registro e identificador de solicitud
  3. Middleware de autenticación y limitación de tasa
  4. Middleware de CORS y recuperación ante panics
← Volver a Go Academy