7.3 KiB
Создание локального плагина для Traefik: Перенос куки jwt_a в заголовок Authorization: Bearer Этот документ описывает, как создать и настроить локальный плагин для Traefik, который извлекает значение куки jwt_a и устанавливает его в заголовок Authorization: Bearer , аналогично правилу HAProxy: acl is_jwt_cookie hdr_sub(cookie) jwt_a= http-request set-header Authorization "Bearer %[cook(jwt_a)]" if is_jwt_cookie
Плагин будет работать локально без публикации на GitHub. 📋 Требования
Go: Версия 1.21 или выше. Traefik: Версия 3.3.4 (или совместимая). Linux Mint/Ubuntu: ОС, на которой установлен Traefik. Права доступа: Пользователь с правами на изменение конфигурации Traefik и запуск сервисов.
📥 Шаг 1: Подготовка окружения
Проверьте, установлен ли Go: go version
Если Go не установлен, установите его: sudo apt update sudo apt install golang
Убедитесь, что Traefik установлен и работает. Проверьте версию: traefik version
📂 Шаг 2: Создание плагина
Создайте директорию для плагина: mkdir -p ~/traefik-jwt-cookie-plugin cd ~/traefik-jwt-cookie-plugin
Инициализируйте Go-модуль: go mod init traefik-jwt-cookie-plugin
Создайте файл plugin.go с кодом плагина: package traefik_jwt_cookie_plugin
import ( "context" "net/http" )
// Config holds the plugin configuration.
type Config struct {
CookieName string json:"cookieName"
}
// CreateConfig creates and initializes the plugin configuration. func CreateConfig() *Config { return &Config{ CookieName: "jwt_a", // Имя куки по умолчанию } }
// JWTCookiePlugin is the plugin structure. type JWTCookiePlugin struct { next http.Handler name string cookieName string }
// New creates a new instance of the plugin. func New(_ context.Context, next http.Handler, config *Config, name string) (http.Handler, error) { return &JWTCookiePlugin{ next: next, name: name, cookieName: config.CookieName, }, nil }
func (p *JWTCookiePlugin) ServeHTTP(rw http.ResponseWriter, req *http.Request) { // Извлекаем куки cookie, err := req.Cookie(p.cookieName) if err == nil && cookie != nil && cookie.Value != "" { // Устанавливаем заголовок Authorization req.Header.Set("Authorization", "Bearer "+cookie.Value) } // Передаем запрос дальше p.next.ServeHTTP(rw, req) }
Создайте файл go.mod (создается автоматически при инициализации модуля): module traefik-jwt-cookie-plugin
go 1.21
Создайте файл plugin.yaml: moduleName: traefik-jwt-cookie-plugin displayName: JWT Cookie to Authorization Header summary: Middleware to extract a cookie and set it as Authorization Bearer header
⚙️ Шаг 3: Настройка Traefik для локального плагина
Отредактируйте файл конфигурации Traefik (/etc/traefik/traefik.yml): experimental: localPlugins: jwtCookiePlugin: moduleName: traefik-jwt-cookie-plugin sourcePath: /home/igor/traefik-jwt-cookie-plugin # Замените на ваш путь
http:
routers:
my-router:
rule: "Host(example.com)" # Замените на ваш домен
service: my-service
middlewares:
- jwt-cookie-middleware
entryPoints:
- web
middlewares: jwt-cookie-middleware: plugin: jwtCookiePlugin: cookieName: "jwt_a"
services: my-service: loadBalancer: servers: - url: "http://backend:8080" # Ваш бэкенд-сервис
Убедитесь, что путь /home/igor/traefik-jwt-cookie-plugin соответствует вашей директории. Проверьте путь: echo $HOME
🔒 Шаг 4: Настройка прав доступа Убедитесь, что Traefik имеет доступ к директории плагина: sudo chown -R igor:igor ~/traefik-jwt-cookie-plugin sudo chmod -R 755 ~/traefik-jwt-cookie-plugin
Если Traefik работает от другого пользователя (например, traefik), выполните: sudo chown -R traefik:traefik ~/traefik-jwt-cookie-plugin
🚀 Шаг 5: Запуск Traefik
Перезапустите Traefik:sudo systemctl restart traefik
Если Traefik запущен вручную:traefik --configFile=/etc/traefik/traefik.yml
🧪 Шаг 6: Тестирование
Включите дебаг-логи в traefik.yml:log: level: DEBUG
Отправьте тестовый запрос с куки jwt_a:curl -H "Host: example.com" -b "jwt_a=your_jwt_token_here" http://192.168.200.85
Проверьте логи Traefik:sudo journalctl -u traefik
Ищите записи, связанные с jwtCookiePlugin, чтобы подтвердить, что куки обрабатываются.
🌐 Шаг 7: Интеграция с HAProxy Поскольку вы используете HAProxy перед Traefik, убедитесь, что HAProxy передает куки без изменений. Если вы хотите перенести логику обработки куки из HAProxy в Traefik, удалите следующее правило из HAProxy: acl is_jwt_cookie hdr_sub(cookie) jwt_a= http-request set-header Authorization "Bearer %[cook(jwt_a)]" if is_jwt_cookie
Обновленная конфигурация HAProxy: frontend fe_main bind *:80 mode http default_backend be_traefik
backend be_traefik mode http server traefik 192.168.200.85:80
⚠️ Возможные проблемы
Ошибка загрузки плагина: Проверьте логи Traefik (journalctl -u traefik) и убедитесь, что sourcePath указан правильно. Куки не извлекаются: Убедитесь, что куки jwt_a передаются в запросе (проверьте через curl или браузер). Go-ошибки: Выполните go mod tidy для установки зависимостей.
✅ Преимущества
Работает локально без публикации на GitHub. Заменяет функциональность HAProxy без внешнего сервиса. Полная интеграция с Traefik.
❗ Недостатки
Требует базовых навыков Go. Экспериментальная поддержка плагинов в Traefik может быть нестабильной.
🔄 Альтернатива Если плагин не работает, оставьте обработку куки в HAProxy, а Traefik используйте только для маршрутизации. Это минимизирует изменения в вашей инфраструктуре.