Go Academy · Урок

Промежуточные обработчики аутентификации и ограничения частоты

Проверка JWT и ограничение частоты по алгоритму корзины токенов

Урок 3 из 413 шагов

«Промежуточные обработчики аутентификации и ограничения частоты» — бесплатный урок Go Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

Промежуточное программное обеспечение для аутентификации JWT

Извлекайте, разбирайте и проверяйте JWT из заголовка 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))
        })
    }
}

Аутентификация по ключу API

Проверяйте ключ API из заголовка по базе данных или набору в памяти:

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)
        })
    }
}

Ограничитель скорости с корзиной токенов

Используйте golang.org/x/time/rate с картой ограничителей для каждого 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)
}

Промежуточное программное обеспечение для ограничения скорости

Проверяйте ограничитель в промежуточном программном обеспечении и возвращайте 429, если лимит превышен:

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)
    })
}

Заголовок Retry-After

Добавляйте заголовок Retry-After с количеством секунд, которое клиент должен подождать перед повторной попыткой:

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

Разграничение доступа на основе ролей

После аутентификации проверяйте роли пользователя в утверждениях контекста перед вызовом 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)
        })
    }
}

Очистка ограничителей

Старые ограничители для отдельных IP-адресов накапливаются в памяти. Очищайте их с помощью фоновой горутины, которая удаляет записи, к которым не обращались последние N минут.

Распределённое ограничение скорости

Ограничители внутри процесса не работают между несколькими экземплярами. Для распределённого ограничения скорости используйте Redis и скользящее окно или сценарий корзины токенов.

429 и 503

Возвращайте 429 Too Many Requests, когда для отдельного клиента действует ограничение скорости. Возвращайте 503 Service Unavailable, когда весь сервис перегружен и снижает нагрузку.

Объединение аутентификации и ограничения скорости

Применяйте их как отдельные компоненты промежуточного программного обеспечения в цепочке. Сначала выполняйте аутентификацию: ограничивайте скорость только для аутентифицированных пользователей, чтобы различать их по идентификатору пользователя, а не по IP-адресу.

Тестирование промежуточного программного обеспечения аутентификации

Используйте httptest для передачи действительных и недействительных токенов и проверяйте, что устанавливаются правильные коды состояния и значения контекста.

Быстрая проверка

Какой код состояния HTTP должно возвращать промежуточное программное обеспечение ограничения скорости, когда клиент превышает свой лимит?

Итоги: аутентификация и ограничение скорости

Основные положения:

  • Промежуточное программное обеспечение JWT: извлечь токен Bearer → разобрать → добавить утверждения в контекст
  • Ограничивайте скорость с помощью golang.org/x/time/rate для каждого IP-адреса или пользователя
  • При превышении лимита возвращайте 429 и заголовок Retry-After
  • Для распределённого ограничения скорости между несколькими экземплярами используйте Redis
Можно начать бесплатно

Изучай Go с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
51
Уроки
203

Часто задаваемые вопросы

Урок «Промежуточные обработчики аутентификации и ограничения частоты» бесплатный?

Да — полный текст урока «Промежуточные обработчики аутентификации и ограничения частоты» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «Промежуточные обработчики аутентификации и ограничения частоты»?

Проверка JWT и ограничение частоты по алгоритму корзины токенов Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Промежуточные обработчики аутентификации и ограничения частоты»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы цепочки HTTP-промежуточных обработчиков
  2. Журналирование и промежуточный обработчик идентификатора запроса
  3. Промежуточные обработчики аутентификации и ограничения частоты
  4. Промежуточные обработчики CORS и восстановления после паники
← Назад к Go Academy