2026-01-20 17:25:34 +05:00
2025-10-01 16:43:15 +05:00
2026-01-20 17:25:34 +05:00
2025-10-01 15:04:07 +05:00
2026-01-20 17:17:22 +05:00
2026-01-20 17:17:22 +05:00
2025-10-10 15:04:01 +05:00
2026-01-20 17:17:22 +05:00
2025-10-02 16:59:42 +05:00
2026-01-20 17:17:22 +05:00
fix
2026-01-16 10:38:54 +05:00
2026-01-20 17:17:22 +05:00

Dex Demo Application

Демонстрационное приложение для аутентификации через DexAuthenticator в Kubernetes (Deckhouse).

preview

Описание

Простое приложение, демонстрирующее интеграцию с 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 образов

# Собрать все образы
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

Тестовые данные

По умолчанию в БД загружаются следующие тестовые пользователи:

  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

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 валидация не работает

Проверьте:

  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
Description
No description provided
Readme 2.9 MiB
Languages
C# 37.6%
Python 22.8%
JavaScript 21.2%
Makefile 7.9%
CSS 5.7%
Other 4.8%