268 lines
7.6 KiB
Markdown
268 lines
7.6 KiB
Markdown
# 🔧 Настройка системы аутентификации
|
||
|
||
## 🎯 Быстрая настройка
|
||
|
||
### 1. Environment Variables
|
||
|
||
```bash
|
||
# JWT настройки
|
||
JWT_SECRET=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://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
|
||
required = ['JWT_SECRET', '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://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
|
||
ENV JWT_SECRET=your_secret_here
|
||
ENV REDIS_URL=redis://redis:6379/0
|
||
ENV SESSION_COOKIE_SECURE=true
|
||
```
|
||
|
||
### Dokku/Heroku
|
||
```bash
|
||
# Установка переменных окружения
|
||
dokku config:set myapp JWT_SECRET=xxx REDIS_URL=yyy
|
||
heroku config:set JWT_SECRET=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 включена
|
||
|
||
**Готово к продакшену!** 🚀✅
|