Files
python-oauth2-proxy-k8s/README.md
tactile 2b1357e981 front to consta
clean dotnet backend
2026-01-20 17:17:22 +05:00

226 lines
8.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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<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