Промежуточные обработчики аутентификации и ограничения частоты
Проверка JWT и ограничение частоты по алгоритму корзины токенов
«Промежуточные обработчики аутентификации и ограничения частоты» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Основы цепочки HTTP-промежуточных обработчиков
- Журналирование и промежуточный обработчик идентификатора запроса
- Промежуточные обработчики аутентификации и ограничения частоты
- Промежуточные обработчики CORS и восстановления после паники