# πŸ” БистСма Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Discours Core ## πŸ“š ΠžΠ±Π·ΠΎΡ€ ΠœΠΎΠ΄ΡƒΠ»ΡŒΠ½Π°Ρ систСма Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ с JWT Ρ‚ΠΎΠΊΠ΅Π½Π°ΠΌΠΈ, Redis-сСссиями, OAuth ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠ΅ΠΉ ΠΈ RBAC Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ httpOnly cookies ΠΈ Bearer Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ для Π²Π΅Π± ΠΈ API ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ². ## πŸš€ Быстрый старт ### Для микросСрвисов ```python from auth.tokens.sessions import SessionTokenManager from auth.utils import extract_token_from_request # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΎΠΊΠ΅Π½Π° sessions = SessionTokenManager() token = await extract_token_from_request(request) payload = await sessions.verify_session(token) if payload: user_id = payload.get("user_id") print(f"ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π½: {user_id}") ``` ### Redis ΠΊΠ»ΡŽΡ‡ΠΈ для поиска ```bash # БСссии ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ session:{user_id}:{token} # Π”Π°Π½Π½Ρ‹Π΅ сСссии (hash) user_sessions:{user_id} # Бписок Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² (set) # OAuth Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ oauth_access:{user_id}:{provider} # Access Ρ‚ΠΎΠΊΠ΅Π½ oauth_refresh:{user_id}:{provider} # Refresh Ρ‚ΠΎΠΊΠ΅Π½ ``` ## πŸ“– ДокумСнтация ### πŸ—οΈ АрхитСктура - **[ΠžΠ±Π·ΠΎΡ€ систСмы](system.md)** - ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρ‹ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² - **[АрхитСктура](architecture.md)** - Π”ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… - **[ΠœΠΈΠ³Ρ€Π°Ρ†ΠΈΡ](migration.md)** - ОбновлСниС с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… вСрсий ### πŸ”‘ АутСнтификация - **[Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ сСссиями](sessions.md)** - JWT Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ ΠΈ Redis Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ - **[OAuth интСграция](oauth.md)** - Π‘ΠΎΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Ρ‹ - **[ΠœΠΈΠΊΡ€ΠΎΡΠ΅Ρ€Π²ΠΈΡΡ‹](microservices.md)** - 🎯 **Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ сСрвисами** ### πŸ› οΈ Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° - **[API Reference](api.md)** - ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ΄Π° - **[Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ](security.md)** - Π›ΡƒΡ‡ΡˆΠΈΠ΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ - **[ВСстированиС](testing.md)** - Unit ΠΈ E2E тСсты ### πŸ”— БвязанныС систСмы - **[RBAC System](../rbac-system.md)** - БистСма Ρ€ΠΎΠ»Π΅ΠΉ ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ - **[Security System](../security.md)** - Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ паролями ΠΈ email - **[Redis Schema](../redis-schema.md)** - Π‘Ρ…Π΅ΠΌΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ## πŸ” Для микросСрвисов ### ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ Redis ```python # Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Redis connection pool from storage.redis import redis # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° сСссии async def check_user_session(token: str) -> dict | None: sessions = SessionTokenManager() return await sessions.verify_session(token) # Массовая ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² from auth.tokens.batch import BatchTokenOperations batch = BatchTokenOperations() results = await batch.batch_validate_tokens(token_list) ``` ### HTTP Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ```python # Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠΊΠ΅Π½Π° ΠΈΠ· запроса from auth.utils import extract_token_from_request, get_safe_headers token = await extract_token_from_request(request) # Или Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ headers = get_safe_headers(request) token = headers.get("authorization", "").replace("Bearer ", "") ``` ## 🎯 ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ - **SessionTokenManager** - JWT сСссии с Redis Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ΠΌ - **OAuthTokenManager** - OAuth access/refresh Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ - **BatchTokenOperations** - ΠœΠ°ΡΡΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с Ρ‚ΠΎΠΊΠ΅Π½Π°ΠΌΠΈ - **TokenMonitoring** - ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΈ статистика - **AuthMiddleware** - HTTP middleware для автоматичСской ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ## ⚑ ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ - **Connection pooling** для Redis - **Batch ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ** для массовых дСйствий (100-1000 Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ²) - **Pipeline использованиС** для атомарности - **SCAN** вмСсто KEYS для бСзопасности - **TTL** автоматичСская очистка ΠΈΡΡ‚Π΅ΠΊΡˆΠΈΡ… Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ²