Files
core/docs/auth/setup.md
2025-09-29 17:57:45 +03:00

7.6 KiB
Raw Blame History

🔧 Настройка системы аутентификации

🎯 Быстрая настройка

1. Environment Variables

# 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
  2. APIs & ServicesCredentialsCreate 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
  2. New OAuth App
  3. Authorization callback URL: https://v3.discours.io/oauth/github/callback

Yandex OAuth

  1. Yandex OAuth
  2. Создать новое приложение
  3. Callback URI: https://v3.discours.io/oauth/yandex/callback
  4. Права: login:info, login:email, login:avatar

VK OAuth

  1. VK Developers
  2. Создать приложениеВеб-сайт
  3. Redirect URI: https://v3.discours.io/oauth/vk/callback

3. Проверка настройки

# Проверка переменных окружения
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://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=your_secret_here
ENV REDIS_URL=redis://redis:6379/0
ENV SESSION_COOKIE_SECURE=true

Dokku/Heroku

# Установка переменных окружения
dokku config:set myapp JWT_SECRET=xxx REDIS_URL=yyy
heroku config:set JWT_SECRET=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 включена

Готово к продакшену! 🚀