+
This commit is contained in:
201
Proxy/Traefik_plugin.md
Normal file
201
Proxy/Traefik_plugin.md
Normal file
@ -0,0 +1,201 @@
|
||||
Создание локального плагина для Traefik: Перенос куки jwt_a в заголовок Authorization: Bearer
|
||||
Этот документ описывает, как создать и настроить локальный плагин для Traefik, который извлекает значение куки jwt_a и устанавливает его в заголовок Authorization: Bearer <token>, аналогично правилу 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 используйте только для маршрутизации. Это минимизирует изменения в вашей инфраструктуре.
|
||||
Reference in New Issue
Block a user