Files
Ubuntu_docs/Proxy/Traefik_plugin.md
2025-08-25 07:41:03 +05:00

7.3 KiB
Raw Permalink Blame History

Создание локального плагина для 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 используйте только для маршрутизации. Это минимизирует изменения в вашей инфраструктуре.