# Dex Demo Application Демонстрационное приложение для аутентификации через DexAuthenticator в Kubernetes (Deckhouse). ![preview](preview.png) ## Описание Простое приложение, демонстрирующее интеграцию с DexAuthenticator: - **Backend (Python/FastAPI)**: валидирует JWT, берет данные пользователя и роли из PostgreSQL - **Backend (.NET)**: функционально идентичен Python backend - **Frontend (React/Vite)**: отображает информацию о пользователе и доступные ресурсы - **PostgreSQL**: хранит пользователей, роли и ссылки - **DexAuthenticator**: обеспечивает аутентификацию через Dex ## Работа приложения 1. Ingress/DexAuthenticator выполняет аутентификацию через Dex/IdP 2. DexAuthenticator проксирует запросы и добавляет заголовки `X-Auth-Request-Email`, `X-Auth-Request-User`, `Authorization` 3. Frontend запрашивает `/api/user-info` 4. Backend валидирует JWT, получает данные из PostgreSQL и возвращает информацию о пользователе и доступных ресурсах ## Архитектура ``` ┌─────────────┐ │ Browser │ └─────┬───────┘ │ ▼ ┌─────────────────────────────────────┐ │ Ingress + DexAuthenticator │ │ (аутентификация через Dex) │ └─────┬───────────────────────────────┘ │ ├──────────► Frontend (React) │ │ │ ▼ └──────────► Backend (FastAPI) │ ▼ PostgreSQL ``` ## Предварительные требования - Kubernetes кластер с Deckhouse - Dex по адресу `https://dex.127.0.0.1.sslip.io` - Docker, kubectl, make ## Быстрый старт ### 1. Сборка Docker образов ```bash # Собрать все образы make build-all # Или по отдельности: make build-backend make build-frontend ``` ### 2. Развертывание в Kubernetes ```bash make deploy ``` Приложение будет доступно по адресу: `https://python-navigator-demo.127.0.0.1.sslip.io` #### Финальная архитектура в Kubernetes: ```mermaid flowchart A["python-navigator-demo.127.0.0.1.sslip.io"] --> B["Единый Ingress + DexAuthenticator
(аутентификация)"] B --> C["Frontend Service"] B --> D["DexAuthenticator Service"] B --> E["Backend Service"] C --> F["Frontend Pods"] D --> G["DexAuthenticator Pods"] E --> H["Backend Pods"] H --> I["PostgreSQL Service"] classDef ingress fill:#e1f5fe classDef service fill:#f3e5f5 classDef pod fill:#e8f5e8 classDef database fill:#fff3e0 class A,B ingress class C,D,E service class F,G,H pod class I database ``` ### 3. Удаление приложения ```bash make undeploy # Или полная очистка (включая Docker образы): make clean ``` ## Структура проекта ``` . ├── backend/ # Python backend (FastAPI) ├── backend-dotnet/ # .NET backend (идентичен по логике) ├── frontend/ # React frontend ├── db/ # PostgreSQL init.sql ├── k8s/ # Kubernetes манифесты ├── Makefile └── README.md ``` ## Компоненты ### Backend (Python/.NET) - `GET /api/health` — проверка здоровья - `GET /api/user-info` — информация о пользователе и доступных ресурсах - Валидирует JWT (подпись, issuer, exp) и читает email/id - Забирает пользователя, роли и ссылки из PostgreSQL ### Тестовые данные По умолчанию в БД загружаются следующие тестовые пользователи: 1. **admin@example.com** (Иван Администраторов) - Роли: admin, developer - Организация: Acme Corporation - Доступ: ко всем ресурсам 2. **developer@example.com** (Мария Разработчикова) - Роли: developer, user - Организация: Tech Innovators Inc - Доступ: технические ресурсы (CI/CD, Git, Docs, Wiki) 3. **user@example.com** (Петр Пользователев) - Роли: user - Организация: Global Solutions Ltd - Доступ: только база знаний 4. **manager@example.com** (Анна Менеджерова) - Роли: manager, user - Организация: Acme Corporation - Доступ: управленческие ресурсы (Проекты, Отчеты, Wiki) **Важно:** Убедитесь, что эти email совпадают с пользователями в вашем Dex, или измените данные в `db/init.sql` ## Конфигурация ### Backend переменные окружения - `DB_HOST`, `DB_PORT`, `DB_NAME`, `DB_USER`, `DB_PASSWORD` - `DEX_ISSUER` (по умолчанию: `https://dex.127.0.0.1.sslip.io/`) ### DexAuthenticator Настройки в `k8s/dex-authenticator.yaml`: - `applicationDomain` — домен приложения - `sendAuthorizationHeader` — отправка заголовка Authorization с JWT - `keepUsersLoggedInFor` — время сессии ## Разработка ### Локальная разработка backend ```bash cd backend python -m venv venv source venv/bin/activate pip install -r requirements.txt export DB_HOST=localhost export DEX_ISSUER=https://dex.127.0.0.1.sslip.io/ python main.py ``` Для удобной локальной разработки без настройки OIDC/Dex есть режим разработки. ```bash export INSECURE_DEV_MODE=true export INSECURE_DEV_EMAIL=developer@example.com ``` #### Что происходит в режиме разработки - **Отключается проверка JWT токенов** - не требуется настройка Dex или OIDC - **Используется фиксированный email** - задается через переменную `INSECURE_DEV_EMAIL` - **Логирование** - в консоли будет выводиться сообщение о том, какой email используется **Никогда не используйте INSECURE_DEV_MODE=true в продакшене!** Это отключает всю аутентификацию. ### Локальная разработка frontend ```bash cd frontend npm install npm run dev ``` Frontend будет доступен на `http://localhost:5173` с проксированием API на `http://localhost:8000` ### Ошибка "User not found in database" Убедитесь, что email пользователя из Dex совпадает с email в таблице `users` в PostgreSQL. ### JWT валидация не работает Проверьте: 1. Доступность Dex JWKS endpoint: `https://dex.127.0.0.1.sslip.io/keys` 2. Переменную окружения `DEX_ISSUER` в backend 3. Логи backend для деталей ошибки ## Дополнительная настройка - Изменение тестовых пользователей: редактируйте `db/init.sql` или `k8s/postgres.yaml`, затем `kubectl delete pod -n navigator-demo -l app=postgres` - Собственный домен: обновите `applicationDomain` в `k8s/dex-authenticator.yaml` и `host` в `k8s/ingress.yaml` - Production: secrets для БД, TLS, resource limits, HPA, внешний PostgreSQL