# 🔧 Настройка системы аутентификации ## 🎯 Быстрая настройка ### 1. Environment Variables ```bash # JWT настройки JWT_SECRET_KEY=your_super_secret_key_minimum_256_bits JWT_ALGORITHM=HS256 JWT_EXPIRATION_HOURS=720 # 30 дней # Cookie настройки (httpOnly для безопасности) SESSION_COOKIE_NAME=session_token SESSION_COOKIE_HTTPONLY=true SESSION_COOKIE_SECURE=true # Только HTTPS в продакшене SESSION_COOKIE_SAMESITE=lax # CSRF защита SESSION_COOKIE_MAX_AGE=2592000 # 30 дней # Redis REDIS_URL=redis://localhost:6379/0 REDIS_SOCKET_KEEPALIVE=true REDIS_HEALTH_CHECK_INTERVAL=30 # OAuth провайдеры GOOGLE_CLIENT_ID=your_google_client_id GOOGLE_CLIENT_SECRET=your_google_client_secret GITHUB_CLIENT_ID=your_github_client_id GITHUB_CLIENT_SECRET=your_github_client_secret YANDEX_CLIENT_ID=your_yandex_client_id YANDEX_CLIENT_SECRET=your_yandex_client_secret VK_CLIENT_ID=your_vk_app_id VK_CLIENT_SECRET=your_vk_secure_key # Безопасность RATE_LIMIT_ENABLED=true MAX_LOGIN_ATTEMPTS=5 LOCKOUT_DURATION=1800 # 30 минут ``` ### 2. OAuth Провайдеры #### Google OAuth 1. [Google Cloud Console](https://console.cloud.google.com/) 2. **APIs & Services** → **Credentials** → **Create OAuth 2.0 Client ID** 3. **Authorized redirect URIs**: - `https://v3.discours.io/oauth/google/callback` (продакшн) - `http://localhost:8000/oauth/google/callback` (разработка) #### GitHub OAuth 1. [GitHub Developer Settings](https://github.com/settings/developers) 2. **New OAuth App** 3. **Authorization callback URL**: `https://v3.discours.io/oauth/github/callback` #### Yandex OAuth 1. [Yandex OAuth](https://oauth.yandex.ru/) 2. **Создать новое приложение** 3. **Callback URI**: `https://v3.discours.io/oauth/yandex/callback` 4. **Права**: `login:info`, `login:email`, `login:avatar` #### VK OAuth 1. [VK Developers](https://dev.vk.com/apps) 2. **Создать приложение** → **Веб-сайт** 3. **Redirect URI**: `https://v3.discours.io/oauth/vk/callback` ### 3. Проверка настройки ```bash # Проверка переменных окружения python -c " import os required = ['JWT_SECRET_KEY', 'REDIS_URL', 'GOOGLE_CLIENT_ID'] for var in required: print(f'{var}: {\"✅\" if os.getenv(var) else \"❌\"}')" # Проверка Redis подключения python -c " import asyncio from storage.redis import redis async def test(): result = await redis.ping() print(f'Redis: {\"✅\" if result else \"❌\"}') asyncio.run(test())" # Проверка OAuth провайдеров curl -v "https://v3.discours.io/oauth/google/login" ``` ## 🔒 Безопасность в продакшене ### SSL/HTTPS настройки ```bash # Принудительное HTTPS FORCE_HTTPS=true HSTS_MAX_AGE=31536000 # Secure cookies только для HTTPS SESSION_COOKIE_SECURE=true ``` ### Rate Limiting ```bash RATE_LIMIT_REQUESTS=100 RATE_LIMIT_WINDOW=3600 # 1 час ``` ### Account Lockout ```bash MAX_LOGIN_ATTEMPTS=5 LOCKOUT_DURATION=1800 # 30 минут ``` ## 🐛 Диагностика проблем ### Частые ошибки #### "Provider not configured" ```bash # Проверить переменные окружения echo $GOOGLE_CLIENT_ID echo $GOOGLE_CLIENT_SECRET # Перезапустить приложение после установки переменных ``` #### "redirect_uri_mismatch" - Проверить точное соответствие URL в настройках провайдера - Убедиться что протокол (http/https) совпадает - Callback URL должен указывать на backend, НЕ на frontend #### "Cookies не работают" ```bash # Проверить настройки cookie curl -v -b "session_token=test" "https://v3.discours.io/graphql" # Проверить что фронтенд отправляет credentials # В коде должно быть: credentials: 'include' ``` #### "CORS ошибки" ```python # В настройках CORS должно быть: allow_credentials=True allow_origins=["https://your-frontend-domain.com"] ``` ### Логи для отладки ```bash # Поиск ошибок аутентификации grep -i "auth\|oauth\|cookie" /var/log/app/app.log # Мониторинг Redis операций redis-cli monitor | grep "session\|oauth" ``` ## 📊 Мониторинг ### Health Check ```python from auth.tokens.monitoring import TokenMonitoring async def auth_health(): monitoring = TokenMonitoring() health = await monitoring.health_check() stats = await monitoring.get_token_statistics() return { "status": health["status"], "redis_connected": health["redis_connected"], "active_sessions": stats["session_tokens"], "memory_usage_mb": stats["memory_usage"] / 1024 / 1024 } ``` ### Метрики для мониторинга - Количество активных сессий - Успешность OAuth авторизаций - Rate limit нарушения - Заблокированные аккаунты - Использование памяти Redis ## 🧪 Тестирование ### Unit тесты ```bash # Запуск auth тестов pytest tests/auth/ -v # Проверка типов mypy auth/ ``` ### E2E тесты ```bash # Тестирование OAuth flow playwright test tests/oauth.spec.ts # Тестирование cookie аутентификации playwright test tests/auth-cookies.spec.ts ``` ### Нагрузочное тестирование ```bash # Тестирование login endpoint ab -n 1000 -c 10 -p login.json -T application/json http://localhost:8000/graphql # Содержимое login.json: # {"query":"mutation{login(email:\"test@example.com\",password:\"password\"){success}}"} ``` ## 🚀 Развертывание ### Docker ```dockerfile # Dockerfile ENV JWT_SECRET_KEY=your_secret_here ENV REDIS_URL=redis://redis:6379/0 ENV SESSION_COOKIE_SECURE=true ``` ### Dokku/Heroku ```bash # Установка переменных окружения dokku config:set myapp JWT_SECRET_KEY=xxx REDIS_URL=yyy heroku config:set JWT_SECRET_KEY=xxx REDIS_URL=yyy ``` ### Nginx настройки ```nginx # Поддержка cookies proxy_set_header Cookie $http_cookie; proxy_cookie_path / "/; Secure; HttpOnly; SameSite=lax"; # CORS для credentials add_header Access-Control-Allow-Credentials true; add_header Access-Control-Allow-Origin https://your-frontend.com; ``` ## ✅ Checklist для продакшена ### Безопасность - [ ] JWT secret минимум 256 бит - [ ] HTTPS принудительно включен - [ ] httpOnly cookies настроены - [ ] SameSite cookies включены - [ ] Rate limiting активен - [ ] Account lockout настроен ### OAuth - [ ] Все провайдеры настроены - [ ] Redirect URIs правильные - [ ] Client secrets безопасно хранятся - [ ] PKCE включен для поддерживающих провайдеров ### Мониторинг - [ ] Health checks настроены - [ ] Логирование работает - [ ] Метрики собираются - [ ] Алерты настроены ### Производительность - [ ] Redis connection pooling - [ ] TTL для всех ключей - [ ] Batch операции для массовых действий - [ ] Memory optimization включена **Готово к продакшену!** 🚀✅