add sequenceDiagram
This commit is contained in:
@ -1,58 +0,0 @@
|
||||
|
||||
### **Финальная архитектура в k8s:**
|
||||
|
||||
```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
|
||||
```
|
||||
|
||||
### **Правильный поток аутентификации:**
|
||||
|
||||
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)
|
||||
BIN
FINAL_STATUS.pdf
BIN
FINAL_STATUS.pdf
Binary file not shown.
62
README.md
62
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 отображает информацию о пользователе и доступные ресурсы
|
||||
|
||||

|
||||
|
||||
## Архитектура
|
||||
|
||||
```
|
||||
@ -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<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
|
||||
@ -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 отображает полученные данные
|
||||
|
||||
## Разработка
|
||||
|
||||
|
||||
BIN
README.pdf
Normal file
BIN
README.pdf
Normal file
Binary file not shown.
85
sequenceDiagram.md
Normal file
85
sequenceDiagram.md
Normal file
@ -0,0 +1,85 @@
|
||||
# Диаграмма последовательности аутентификации
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant User as Пользователь
|
||||
participant Browser as Браузер
|
||||
participant Ingress as Nginx Ingress
|
||||
participant DexAuth as DexAuthenticator<br/>(OAuth2 Proxy)
|
||||
participant Frontend as Frontend<br/>(React SPA)
|
||||
participant Backend as Backend<br/>(FastAPI)
|
||||
participant Dex as Dex<br/>(Proxy IdP)
|
||||
participant BlitzIdP as Blitz IdP<br/>(Основной IdP)
|
||||
participant LDAP as LDAP<br/>(Резервный 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 не хранит токены<br/>✅ Автоматическое обновление токенов<br/>✅ Безопасность на уровне инфраструктуры<br/>✅ Прозрачность для приложения<br/>✅ JWT валидация на Backend<br/>✅ Ролевая модель в PostgreSQL
|
||||
```
|
||||
BIN
sequenceDiagram.png
Normal file
BIN
sequenceDiagram.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.2 MiB |
Reference in New Issue
Block a user