[0.9.28] - OAuth/Auth with httpOnly cookie
All checks were successful
Deploy on push / deploy (push) Successful in 4m32s
All checks were successful
Deploy on push / deploy (push) Successful in 4m32s
This commit is contained in:
@@ -1,12 +1,19 @@
|
||||
# Архитектура системы авторизации Discours Core
|
||||
# 🏗️ Архитектура системы авторизации Discours Core
|
||||
|
||||
## 🎯 Обзор архитектуры
|
||||
## 🎯 Обзор архитектуры 2025
|
||||
|
||||
Модульная система авторизации с разделением ответственности между компонентами.
|
||||
Модульная система авторизации с **httpOnly cookies** для максимальной безопасности и единообразия.
|
||||
|
||||
**Ключевые принципы:**
|
||||
- **🍪 httpOnly cookies** для ВСЕХ типов авторизации (OAuth + Email/Password)
|
||||
- **🛡️ Максимальная безопасность** - защита от XSS и CSRF
|
||||
- **🔄 Единообразие** - один механизм для всех провайдеров
|
||||
- **📱 Автоматическое управление** - браузер сам отправляет cookies
|
||||
|
||||
**Хранение данных:**
|
||||
- **Токены** → Redis (сессии, OAuth, verification)
|
||||
- **Пользователи** → PostgreSQL (основные данные + OAuth в JSON поле)
|
||||
- **Сессии** → Redis (JWT токены) + httpOnly cookies (передача)
|
||||
- **OAuth токены** → Redis (для API интеграций)
|
||||
- **Пользователи** → PostgreSQL (основные данные + OAuth связи)
|
||||
|
||||
## 📊 Схема потоков данных
|
||||
|
||||
@@ -121,67 +128,90 @@ graph TB
|
||||
OTM --> RESP
|
||||
```
|
||||
|
||||
## 🔐 OAuth Flow
|
||||
## 🔐 OAuth Flow (httpOnly cookies)
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant U as User
|
||||
participant F as Frontend
|
||||
participant A as Auth Service
|
||||
participant B as Backend
|
||||
participant R as Redis
|
||||
participant P as OAuth Provider
|
||||
|
||||
U->>F: Click "Login with Provider"
|
||||
F->>A: GET /oauth/{provider}?state={csrf}
|
||||
A->>R: Store OAuth state (TTL: 10 min)
|
||||
A->>P: Redirect to Provider
|
||||
F->>B: GET /oauth/{provider}/login
|
||||
B->>R: Store OAuth state (TTL: 10 min)
|
||||
B->>P: Redirect to Provider
|
||||
P->>U: Show authorization page
|
||||
U->>P: Grant permission
|
||||
P->>A: GET /oauth/{provider}/callback?code={code}&state={state}
|
||||
A->>R: Verify state
|
||||
A->>P: Exchange code for token
|
||||
P->>A: Return access token + user data
|
||||
A->>R: Store OAuth tokens
|
||||
A->>A: Generate JWT session token
|
||||
A->>R: Store session in Redis
|
||||
A->>F: Redirect with JWT token
|
||||
F->>U: User logged in
|
||||
P->>B: GET /oauth/{provider}/callback?code={code}&state={state}
|
||||
B->>R: Verify state
|
||||
B->>P: Exchange code for token
|
||||
P->>B: Return access token + user data
|
||||
B->>B: Create/update user
|
||||
B->>B: Generate JWT session token
|
||||
B->>R: Store session in Redis
|
||||
B->>F: Redirect + Set httpOnly cookie
|
||||
Note over B,F: Cookie: session_token=JWT<br/>HttpOnly, Secure, SameSite=lax
|
||||
F->>U: User logged in (cookie automatic)
|
||||
|
||||
Note over F,B: All subsequent requests
|
||||
F->>B: GraphQL with credentials: 'include'
|
||||
Note over F,B: Browser automatically sends cookie
|
||||
```
|
||||
|
||||
## 🔄 Session Management
|
||||
## 🔄 Session Management (httpOnly cookies)
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> Anonymous
|
||||
Anonymous --> Authenticating: Login attempt
|
||||
Authenticating --> Authenticated: Valid JWT + Redis session
|
||||
Anonymous --> Authenticating: Login attempt (OAuth/Email)
|
||||
Authenticating --> Authenticated: Valid JWT + httpOnly cookie set
|
||||
Authenticating --> Anonymous: Invalid credentials
|
||||
Authenticated --> Refreshing: Token near expiry
|
||||
Refreshing --> Authenticated: Successful refresh
|
||||
Refreshing --> Authenticated: New httpOnly cookie set
|
||||
Refreshing --> Anonymous: Refresh failed
|
||||
Authenticated --> Anonymous: Logout/Revoke
|
||||
Authenticated --> Anonymous: Token expired
|
||||
Authenticated --> Anonymous: Logout (cookie deleted)
|
||||
Authenticated --> Anonymous: Token expired (cookie invalid)
|
||||
|
||||
note right of Authenticated
|
||||
All requests include
|
||||
httpOnly cookie automatically
|
||||
via credentials: 'include'
|
||||
end note
|
||||
```
|
||||
|
||||
## 🗄️ Redis структура данных
|
||||
|
||||
```bash
|
||||
# JWT Sessions
|
||||
# JWT Sessions (основные - передаются через httpOnly cookies)
|
||||
session:{user_id}:{token} # Hash: {user_id, username, device_info, last_activity}
|
||||
user_sessions:{user_id} # Set: {token1, token2, ...}
|
||||
|
||||
# Verification Tokens
|
||||
verification_token:{token} # JSON: {user_id, type, data, created_at}
|
||||
|
||||
# OAuth Tokens
|
||||
# OAuth Tokens (для API интеграций - НЕ для аутентификации)
|
||||
oauth_access:{user_id}:{provider} # JSON: {token, expires_in, scope}
|
||||
oauth_refresh:{user_id}:{provider} # JSON: {token, provider_data}
|
||||
oauth_state:{state} # JSON: {provider, redirect_uri, code_verifier}
|
||||
|
||||
# Legacy (для совместимости)
|
||||
{user_id}-{username}-{token} # Hash: legacy format
|
||||
# OAuth State (временные - для CSRF защиты)
|
||||
oauth_state:{state} # JSON: {provider, redirect_uri, code_verifier} TTL: 10 мин
|
||||
|
||||
# Verification Tokens (email подтверждения и т.д.)
|
||||
verification_token:{token} # JSON: {user_id, type, data, created_at}
|
||||
```
|
||||
|
||||
### 🔄 Изменения в архитектуре 2025:
|
||||
|
||||
**Убрано:**
|
||||
- ❌ Токены в URL параметрах (небезопасно)
|
||||
- ❌ localStorage для основных токенов (уязвимо к XSS)
|
||||
- ❌ Bearer заголовки для веб-приложений (сложнее управлять)
|
||||
|
||||
**Добавлено:**
|
||||
- ✅ httpOnly cookies для всех типов авторизации
|
||||
- ✅ Автоматическая отправка cookies браузером
|
||||
- ✅ SameSite защита от CSRF
|
||||
- ✅ Secure flag для HTTPS
|
||||
|
||||
### Примеры Redis команд
|
||||
|
||||
```bash
|
||||
|
||||
Reference in New Issue
Block a user