7.6 KiB
7.6 KiB
🔧 Настройка системы аутентификации
🎯 Быстрая настройка
1. Environment Variables
# 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
- Google Cloud Console
- APIs & Services → Credentials → Create OAuth 2.0 Client ID
- Authorized redirect URIs:
https://v3.discours.io/oauth/google/callback(продакшн)http://localhost:8000/oauth/google/callback(разработка)
GitHub OAuth
- GitHub Developer Settings
- New OAuth App
- Authorization callback URL:
https://v3.discours.io/oauth/github/callback
Yandex OAuth
- Yandex OAuth
- Создать новое приложение
- Callback URI:
https://v3.discours.io/oauth/yandex/callback - Права:
login:info,login:email,login:avatar
VK OAuth
- VK Developers
- Создать приложение → Веб-сайт
- Redirect URI:
https://v3.discours.io/oauth/vk/callback
3. Проверка настройки
# Проверка переменных окружения
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 настройки
# Принудительное HTTPS
FORCE_HTTPS=true
HSTS_MAX_AGE=31536000
# Secure cookies только для HTTPS
SESSION_COOKIE_SECURE=true
Rate Limiting
RATE_LIMIT_REQUESTS=100
RATE_LIMIT_WINDOW=3600 # 1 час
Account Lockout
MAX_LOGIN_ATTEMPTS=5
LOCKOUT_DURATION=1800 # 30 минут
🐛 Диагностика проблем
Частые ошибки
"Provider not configured"
# Проверить переменные окружения
echo $GOOGLE_CLIENT_ID
echo $GOOGLE_CLIENT_SECRET
# Перезапустить приложение после установки переменных
"redirect_uri_mismatch"
- Проверить точное соответствие URL в настройках провайдера
- Убедиться что протокол (http/https) совпадает
- Callback URL должен указывать на backend, НЕ на frontend
"Cookies не работают"
# Проверить настройки cookie
curl -v -b "session_token=test" "https://v3.discours.io/graphql"
# Проверить что фронтенд отправляет credentials
# В коде должно быть: credentials: 'include'
"CORS ошибки"
# В настройках CORS должно быть:
allow_credentials=True
allow_origins=["https://your-frontend-domain.com"]
Логи для отладки
# Поиск ошибок аутентификации
grep -i "auth\|oauth\|cookie" /var/log/app/app.log
# Мониторинг Redis операций
redis-cli monitor | grep "session\|oauth"
📊 Мониторинг
Health Check
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 тесты
# Запуск auth тестов
pytest tests/auth/ -v
# Проверка типов
mypy auth/
E2E тесты
# Тестирование OAuth flow
playwright test tests/oauth.spec.ts
# Тестирование cookie аутентификации
playwright test tests/auth-cookies.spec.ts
Нагрузочное тестирование
# Тестирование 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
ENV JWT_SECRET_KEY=your_secret_here
ENV REDIS_URL=redis://redis:6379/0
ENV SESSION_COOKIE_SECURE=true
Dokku/Heroku
# Установка переменных окружения
dokku config:set myapp JWT_SECRET_KEY=xxx REDIS_URL=yyy
heroku config:set JWT_SECRET_KEY=xxx REDIS_URL=yyy
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 включена
Готово к продакшену! 🚀✅