diff --git a/FINAL_STATUS.md b/FINAL_STATUS.md deleted file mode 100644 index 6cb36ce..0000000 --- a/FINAL_STATUS.md +++ /dev/null @@ -1,58 +0,0 @@ - -### **Финальная архитектура в k8s:** - -```mermaid -flowchart - A["python-navigator-demo.127.0.0.1.sslip.io"] --> B["Единый Ingress + DexAuthenticator
(аутентификация)"] - - 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 -``` - -### **Правильный поток аутентификации:** - -1. Пользователь заходит на `https://python-navigator-demo.127.0.0.1.sslip.io` -2. DexAuthenticator проверяет аутентификацию -3. Если не аутентифицирован → редирект на Dex (HTTP 302) -4. Если не аутентифицирован в Dex → редирект на Blitz IdP (HTTP 302) -4. После аутентификации в Blitz IdP → возврат в Dex -4. После аутентификации в Dex → возврат в приложение -5. Frontend загружается с аутентификацией -6. Frontend делает запрос к `/api/user-info` -7. Backend получает JWT токен и валидирует его -8. Backend возвращает данные пользователя из PostgreSQL -9. Frontend отображает информацию о пользователе и доступные ресурсы - -### **Для тестирования:** - -**Откройте браузер и перейдите на `https://python-navigator-demo.127.0.0.1.sslip.io`** - -Вас должно перенаправить на Dex для аутентификации. После входа вы увидите: -- Информацию о пользователе (email, полное имя, организация) -- Его роли (admin, developer, user, manager) -- Доступные ресурсы на основе ролей - -### **Тестовые пользователи:** - -Убедитесь, что в вашем Dex и внешнем IdP есть пользователи: -- `admin@example.com` - полный доступ ко всем ресурсам -- `developer@example.com` - технические ресурсы (CI/CD, Git, Docs, Wiki) -- `user@example.com` - только база знаний -- `manager@example.com` - управленческие ресурсы (Проекты, Отчеты, Wiki) diff --git a/FINAL_STATUS.pdf b/FINAL_STATUS.pdf deleted file mode 100644 index 4d768f8..0000000 Binary files a/FINAL_STATUS.pdf and /dev/null differ diff --git a/README.md b/README.md index 27dcb7e..73034af 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,27 @@ - **PostgreSQL**: Хранит пользователей, роли и доступные ссылки - **DexAuthenticator**: Обеспечивает аутентификацию через Dex +## Работа приложения + +1. Пользователь открывает `https://python-navigator-demo.127.0.0.1.sslip.io` +2. Ingress перенаправляет на DexAuthenticator для аутентификации +3. Если не аутентифицирован происходит редирект на Dex (HTTP 302) для входа +4. Если не аутентифицирован в Dex происходит редирект на Blitz IdP (HTTP 302) для входа +5. После аутентификации в Blitz IdP → возврат в Dex +6. После успешной аутентификации Dex возвращает токен в DexAuthenticator +7. DexAuthenticator устанавливает заголовки (`X-Auth-Request-Email`,`X-Auth-Request-User`, `Authorization`) и cookie +8. После успешной аутентификации Frontend загружается +9. Frontend делает запрос к `/api/user-info` +10. DexAuthenticator устанавливает заголовки (`X-Auth-Request-Email`,`X-Auth-Request-User`, `Authorization`) и cookie +11. Backend: + - Валидирует JWT токен из заголовка `Authorization` + - Извлекает email/id пользователя + - Получает данные из PostgreSQL + - Возвращает информацию о пользователе и доступных ресурсах +12. Frontend отображает информацию о пользователе и доступные ресурсы + +![Диаграмма последовательности](sequenceDiagram.png) + ## Архитектура ``` @@ -63,6 +84,33 @@ 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
(аутентификация)"] + + 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 @@ -176,20 +224,6 @@ make clean - `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 отображает полученные данные ## Разработка diff --git a/README.pdf b/README.pdf new file mode 100644 index 0000000..64f0a84 Binary files /dev/null and b/README.pdf differ diff --git a/sequenceDiagram.md b/sequenceDiagram.md new file mode 100644 index 0000000..b87df27 --- /dev/null +++ b/sequenceDiagram.md @@ -0,0 +1,85 @@ +# Диаграмма последовательности аутентификации + +```mermaid +sequenceDiagram + participant User as Пользователь + participant Browser as Браузер + participant Ingress as Nginx Ingress + participant DexAuth as DexAuthenticator
(OAuth2 Proxy) + participant Frontend as Frontend
(React SPA) + participant Backend as Backend
(FastAPI) + participant Dex as Dex
(Proxy IdP) + participant BlitzIdP as Blitz IdP
(Основной IdP) + participant LDAP as LDAP
(Резервный IdP) + participant PostgreSQL as PostgreSQL + + Note over User, PostgreSQL: Процесс аутентификации пользователя + + %% Пользователь обращается к приложению + User->>Browser: 1. Открывает python-navigator-demo.127.0.0.1.sslip.io + Browser->>Ingress: 2. HTTPS запрос к приложению + Ingress->>DexAuth: 3. Проверка аутентификации через auth-url + + alt Сессия не найдена или истекла + DexAuth->>DexAuth: 4. Проверка session cookie + DexAuth->>Dex: 5. Перенаправление на аутентификацию (HTTP 302) + Dex->>BlitzIdP: 6. Запрос аутентификации + + alt Blitz IdP недоступен + Dex->>LDAP: 7a. Переключение на резервный IdP + LDAP-->>Dex: 7b. Ответ от LDAP + else Blitz IdP доступен + BlitzIdP-->>Dex: 7c. Ответ от Blitz IdP + end + + Dex-->>DexAuth: 8. Возврат токенов (access_token, refresh_token) + DexAuth->>DexAuth: 9. Сохранение токенов в сессии + DexAuth-->>Ingress: 10. Установка заголовков (X-Auth-Request-User, X-Auth-Request-Email, Authorization) + end + + Ingress->>Frontend: 11. Перенаправление на Frontend с заголовками + Frontend-->>Browser: 12. Загрузка React приложения + Browser-->>User: 13. Отображение приложения + + Note over User, PostgreSQL: Взаимодействие с Backend через API + + %% Пользователь взаимодействует с приложением + User->>Browser: 14. Взаимодействие с интерфейсом + Browser->>Frontend: 15. Клик/действие пользователя + Frontend->>Ingress: 16. API запрос к /api/user-info + + Ingress->>DexAuth: 17. Проверка аутентификации для API + DexAuth->>DexAuth: 18. Проверка session cookie + DexAuth->>DexAuth: 19. Извлечение токенов из сессии + + alt Токен истек + DexAuth->>Dex: 20. Обновление access token через refresh_token + Dex->>BlitzIdP: 21. Обновление через основной IdP + + alt Blitz IdP недоступен + Dex->>LDAP: 22a. Обновление через LDAP + LDAP-->>Dex: 22b. Новый токен от LDAP + else Blitz IdP доступен + BlitzIdP-->>Dex: 22c. Новый токен от Blitz IdP + end + + Dex-->>DexAuth: 23. Новый access token + DexAuth->>DexAuth: 24. Обновление сессии + end + + DexAuth-->>Ingress: 25. Установка заголовков (Authorization: Bearer JWT) + Ingress->>Backend: 26. Проксирование запроса с Authorization header + + Backend->>Backend: 27. Валидация JWT токена через Dex JWKS + Backend->>Backend: 28. Извлечение email из токена + Backend->>PostgreSQL: 29. Запрос данных пользователя + PostgreSQL-->>Backend: 30. Данные пользователя (роли, организация, ссылки) + Backend-->>Ingress: 31. JSON ответ с данными пользователя + Ingress-->>Frontend: 32. Ответ с данными + Frontend-->>Browser: 33. Обновление интерфейса + Browser-->>User: 34. Отображение информации о пользователе + + Note over User, PostgreSQL: Преимущества архитектуры + + Note right of DexAuth: ✅ SPA не хранит токены
✅ Автоматическое обновление токенов
✅ Безопасность на уровне инфраструктуры
✅ Прозрачность для приложения
✅ JWT валидация на Backend
✅ Ролевая модель в PostgreSQL +``` diff --git a/sequenceDiagram.png b/sequenceDiagram.png new file mode 100644 index 0000000..170539c Binary files /dev/null and b/sequenceDiagram.png differ