226 lines
8.2 KiB
Markdown
226 lines
8.2 KiB
Markdown
# Dex Demo Application
|
||
|
||
Демонстрационное приложение для аутентификации через DexAuthenticator в Kubernetes (Deckhouse).
|
||
|
||

|
||
|
||
## Описание
|
||
|
||
Простое приложение, демонстрирующее интеграцию с 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<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. Удаление приложения
|
||
|
||
```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
|