This commit is contained in:
2025-10-01 15:04:07 +05:00
commit b526a80e1f
33 changed files with 4581 additions and 0 deletions

249
README.md Normal file
View File

@@ -0,0 +1,249 @@
# Dex Demo Application
Демонстрационное приложение для аутентификации через DexAuthenticator в Kubernetes кластере с Deckhouse.
## Описание
Простое приложение, демонстрирующее интеграцию с DexAuthenticator:
- **Backend (Python/FastAPI)**: Валидирует JWT токены, получает данные пользователя из PostgreSQL
- **Frontend (React/Vite)**: Отображает информацию о пользователе и доступные ресурсы на основе ролей
- **PostgreSQL**: Хранит пользователей, роли и доступные ссылки
- **DexAuthenticator**: Обеспечивает аутентификацию через Dex
## Архитектура
```
┌─────────────┐
│ 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`
### 3. Удаление приложения
```bash
make undeploy
# Или полная очистка (включая Docker образы):
make clean
```
## Структура проекта
```
.
├── backend/ # Python бэкенд
│ ├── main.py # FastAPI приложение
│ ├── requirements.txt # Python зависимости
│ └── Dockerfile # Docker образ
├── frontend/ # React фронтенд
│ ├── src/
│ │ ├── App.jsx # Главный компонент
│ │ └── App.css # Стили
│ ├── nginx.conf # Nginx конфигурация
│ └── Dockerfile # Docker образ
├── db/ # База данных
│ └── init.sql # SQL скрипт инициализации
├── k8s/ # Kubernetes манифесты
│ ├── namespace.yaml
│ ├── postgres.yaml
│ ├── backend.yaml
│ ├── frontend.yaml
│ ├── dex-authenticator.yaml
│ └── ingress.yaml
├── Makefile # Команды для сборки и развертывания
└── README.md # Документация
```
## Компоненты
### Backend (FastAPI)
**Эндпоинты:**
- `GET /api/health` - Проверка здоровья сервиса
- `GET /api/user-info` - Получение информации о пользователе
**Функциональность:**
- Валидация JWT токенов от Dex (проверка подписи, issuer, exp)
- Извлечение email пользователя из токена или заголовков
- Получение данных пользователя из PostgreSQL (организация, полное имя)
- Получение ролей пользователя
- Получение доступных ссылок на основе ролей
### Frontend (React + Vite)
**Функциональность:**
- Отображение информации о пользователе
- Список ролей
- Доступные ресурсы на основе ролей пользователя
- Никакой логики аутентификации (вся аутентификация на стороне DexAuthenticator)
### База данных (PostgreSQL)
**Схема:**
- `organizations` - Организации
- `users` - Пользователи
- `roles` - Роли
- `user_roles` - Связь пользователей и ролей
- `links` - Доступные ссылки
- `role_links` - Связь ролей и ссылок
### Тестовые данные
По умолчанию в БД загружаются следующие тестовые пользователи:
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` - Хост PostgreSQL (по умолчанию: `postgres`)
- `DB_PORT` - Порт PostgreSQL (по умолчанию: `5432`)
- `DB_NAME` - Имя БД (по умолчанию: `dexdemo`)
- `DB_USER` - Пользователь БД (по умолчанию: `dexdemo`)
- `DB_PASSWORD` - Пароль БД
- `DEX_ISSUER` - URL Dex issuer (по умолчанию: `https://dex.127.0.0.1.sslip.io/`)
### DexAuthenticator
Настройки в `k8s/dex-authenticator.yaml`:
- `applicationDomain` - Домен приложения
- `sendAuthorizationHeader` - Отправка заголовка Authorization с JWT
- `keepUsersLoggedInFor` - Время сессии (24h)
## Работа приложения
1. Пользователь открывает `https://python-navigator-demo.127.0.0.1.sslip.io`
2. Ingress перенаправляет на DexAuthenticator для аутентификации
3. DexAuthenticator редиректит на Dex для входа
4. После успешной аутентификации Dex возвращает токен
5. DexAuthenticator устанавливает заголовки (`X-Auth-Request-Email`,`X-Auth-Request-User`, `Authorization`)
6. Frontend загружается и делает запрос к `/api/user-info`
7. Backend:
- Валидирует JWT токен
- Извлекает email пользователя
- Получает данные из PostgreSQL
- Возвращает информацию о пользователе и доступных ресурсах
8. Frontend отображает полученные данные
## Разработка
### Локальная разработка 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
```
### Локальная разработка 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` (ConfigMap `postgres-init`), затем:
```bash
kubectl delete pod -n navigator-demo -l app=postgres
```
### Использование собственного домена
Измените `applicationDomain` в `k8s/dex-authenticator.yaml` и `host` в `k8s/ingress.yaml`
### Production deployment
Для production окружения:
1. Используйте secrets для паролей БД
3. Включите TLS сертификаты
4. Настройте resource limits
5. Добавьте HorizontalPodAutoscaler
6. Используйте внешний PostgreSQL