Плагин для Traefik, который проверяет токены авторизации для доступа к iCal календарям PSU.
- Проверка токенов авторизации через upstream сервер
- Кэширование валидных токенов для уменьшения нагрузки на upstream
- Мультиплексирование идентичных запросов авторизации
- Ограничение скорости запросов (rate limiting) глобально и по IP
- Поддержка белых списков подсетей
- Настраиваемое логирование
- Upstream сервер всегда возвращает HTTP статус 200 (OK), поэтому валидация токена происходит по содержимому ответа
- Валидный ответ должен начинаться с "BEGIN"
- Токен должен быть длиной 16 символов
- Traefik v2.5 или выше с поддержкой плагинов
- Go 1.16 или выше (для разработки)
- Добавьте плагин в конфигурацию Traefik:
# Статическая конфигурация Traefik
experimental:
plugins:
icalmiddleware:
moduleName: "github.com/ijo42/icalmiddleware"
version: "v1.0.0"
- Настройте плагин в динамической конфигурации:
# Динамическая конфигурация
http:
middlewares:
ical-auth:
plugin:
icalmiddleware:
headerName: "Authorization"
forwardToken: false
freshness: 3600
allowSubnet: ["192.168.1.0/24", "10.0.0.0/8"]
timeout: 10
globalRateLimit: 100
perIPRateLimit: 10
rateLimitWindow: 60
logLevel: "info"
cleanupInterval: 300
upstreamURL: "https://ical.psu.ru/calendars/"
- Примените middleware к вашему роуту:
http:
routers:
ical:
rule: "Host(`calendar.example.com`)"
service: "ical-service"
middlewares:
- "ical-auth"
Параметр | Тип | По умолчанию | Описание |
---|---|---|---|
headerName |
string | "Authorization" |
Имя заголовка, содержащего токен авторизации |
forwardToken |
bool | false |
Передавать ли токен авторизации upstream сервису |
freshness |
int64 | 3600 |
Время жизни кэша токенов в секундах |
allowSubnet |
[]string | ["0.0.0.0/24"] |
Список подсетей, которым разрешен доступ без авторизации |
timeout |
int64 | 10 |
Таймаут запросов к upstream в секундах |
globalRateLimit |
int | 100 |
Глобальное ограничение запросов в период |
perIPRateLimit |
int | 10 |
Ограничение запросов по IP в период |
rateLimitWindow |
int64 | 60 |
Период для ограничения запросов в секундах |
logLevel |
string | "info" |
Уровень логирования ("error" , "info" , "debug" ) |
cleanupInterval |
int64 | 300 |
Интервал очистки устаревших данных в секундах |
upstreamURL |
string | "https://ical.psu.ru/calendars/" |
URL upstream сервера для проверки токенов |
http:
middlewares:
ical-auth:
plugin:
icalmiddleware:
headerName: "Authorization"
freshness: 3600
http:
middlewares:
ical-auth:
plugin:
icalmiddleware:
headerName: "Authorization"
forwardToken: false
freshness: 3600
allowSubnet: ["192.168.1.0/24", "10.0.0.0/8"]
timeout: 10
globalRateLimit: 100
perIPRateLimit: 10
rateLimitWindow: 60
logLevel: "debug"
go build -o icalmiddleware.so -buildmode=plugin ./
go test -v ./...
MIT