Dex Demo Application
Демонстрационное приложение для аутентификации через DexAuthenticator в Kubernetes (Deckhouse).
Описание
Простое приложение, демонстрирующее интеграцию с DexAuthenticator:
- Backend (Python/FastAPI): валидирует JWT, берет данные пользователя и роли из PostgreSQL
- Backend (.NET): функционально идентичен Python backend
- Frontend (React/Vite): отображает информацию о пользователе и доступные ресурсы
- PostgreSQL: хранит пользователей, роли и ссылки
- DexAuthenticator: обеспечивает аутентификацию через Dex
Работа приложения
- Ingress/DexAuthenticator выполняет аутентификацию через Dex/IdP
- DexAuthenticator проксирует запросы и добавляет заголовки
X-Auth-Request-Email,X-Auth-Request-User,Authorization - Frontend запрашивает
/api/user-info - 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 образов
# Собрать все образы
make build-all
# Или по отдельности:
make build-backend
make build-frontend
2. Развертывание в Kubernetes
make deploy
Приложение будет доступно по адресу: https://python-navigator-demo.127.0.0.1.sslip.io
Финальная архитектура в Kubernetes:
flowchart
A["python-navigator-demo.127.0.0.1.sslip.io"] --> B["Единый Ingress + DexAuthenticator<br/>(аутентификация)"]
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. Удаление приложения
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
Тестовые данные
По умолчанию в БД загружаются следующие тестовые пользователи:
-
admin@example.com (Иван Администраторов)
- Роли: admin, developer
- Организация: Acme Corporation
- Доступ: ко всем ресурсам
-
developer@example.com (Мария Разработчикова)
- Роли: developer, user
- Организация: Tech Innovators Inc
- Доступ: технические ресурсы (CI/CD, Git, Docs, Wiki)
-
user@example.com (Петр Пользователев)
- Роли: user
- Организация: Global Solutions Ltd
- Доступ: только база знаний
-
manager@example.com (Анна Менеджерова)
- Роли: manager, user
- Организация: Acme Corporation
- Доступ: управленческие ресурсы (Проекты, Отчеты, Wiki)
Важно: Убедитесь, что эти email совпадают с пользователями в вашем Dex, или измените данные в db/init.sql
Конфигурация
Backend переменные окружения
DB_HOST,DB_PORT,DB_NAME,DB_USER,DB_PASSWORDDEX_ISSUER(по умолчанию:https://dex.127.0.0.1.sslip.io/)
DexAuthenticator
Настройки в k8s/dex-authenticator.yaml:
applicationDomain— домен приложенияsendAuthorizationHeader— отправка заголовка Authorization с JWTkeepUsersLoggedInFor— время сессии
Разработка
Локальная разработка backend
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 есть режим разработки.
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
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 валидация не работает
Проверьте:
- Доступность Dex JWKS endpoint:
https://dex.127.0.0.1.sslip.io/keys - Переменную окружения
DEX_ISSUERв backend - Логи 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
