2025-09-28 12:22:37 +03:00
|
|
|
|
# 🔧 Настройка системы аутентификации
|
|
|
|
|
|
|
|
|
|
|
|
## 🎯 Быстрая настройка
|
|
|
|
|
|
|
|
|
|
|
|
### 1. Environment Variables
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# JWT настройки
|
2025-09-30 21:48:29 +03:00
|
|
|
|
JWT_SECRET_KEY=your_super_secret_key_minimum_256_bits
|
2025-09-28 12:22:37 +03:00
|
|
|
|
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://your-domain.com/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://your-domain.com/oauth/github/callback`
|
|
|
|
|
|
|
|
|
|
|
|
#### Yandex OAuth
|
|
|
|
|
|
1. [Yandex OAuth](https://oauth.yandex.ru/)
|
|
|
|
|
|
2. **Создать новое приложение**
|
|
|
|
|
|
3. **Callback URI**: `https://your-domain.com/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://your-domain.com/oauth/vk/callback`
|
|
|
|
|
|
|
|
|
|
|
|
### 3. Проверка настройки
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# Проверка переменных окружения
|
|
|
|
|
|
python -c "
|
|
|
|
|
|
import os
|
2025-09-30 21:48:29 +03:00
|
|
|
|
required = ['JWT_SECRET_KEY', 'REDIS_URL', 'GOOGLE_CLIENT_ID']
|
2025-09-28 12:22:37 +03:00
|
|
|
|
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://your-domain.com/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://your-domain.com/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
|
2025-09-30 21:48:29 +03:00
|
|
|
|
ENV JWT_SECRET_KEY=your_secret_here
|
2025-09-28 12:22:37 +03:00
|
|
|
|
ENV REDIS_URL=redis://redis:6379/0
|
|
|
|
|
|
ENV SESSION_COOKIE_SECURE=true
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### Dokku/Heroku
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# Установка переменных окружения
|
2025-09-30 21:48:29 +03:00
|
|
|
|
dokku config:set myapp JWT_SECRET_KEY=xxx REDIS_URL=yyy
|
|
|
|
|
|
heroku config:set JWT_SECRET_KEY=xxx REDIS_URL=yyy
|
2025-09-28 12:22:37 +03:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 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 включена
|
|
|
|
|
|
|
|
|
|
|
|
**Готово к продакшену!** 🚀✅
|