323 lines
10 KiB
Markdown
323 lines
10 KiB
Markdown
|
# Миграция системы авторизации
|
|||
|
|
|||
|
## Обзор изменений
|
|||
|
|
|||
|
Система авторизации была полностью переработана для улучшения производительности, безопасности и поддерживаемости:
|
|||
|
|
|||
|
### Основные изменения
|
|||
|
- ✅ Упрощена архитектура токенов (убрана прокси-логика)
|
|||
|
- ✅ Исправлены проблемы с типами (mypy clean)
|
|||
|
- ✅ Оптимизированы Redis операции
|
|||
|
- ✅ Добавлена система мониторинга токенов
|
|||
|
- ✅ Улучшена производительность OAuth
|
|||
|
- ✅ Удалены deprecated компоненты
|
|||
|
|
|||
|
## Миграция кода
|
|||
|
|
|||
|
### TokenStorage API
|
|||
|
|
|||
|
#### Было (deprecated):
|
|||
|
```python
|
|||
|
# Старый универсальный API
|
|||
|
await TokenStorage.create_token("session", user_id, data, ttl)
|
|||
|
await TokenStorage.get_token_data("session", token)
|
|||
|
await TokenStorage.validate_token(token, "session")
|
|||
|
await TokenStorage.revoke_token("session", token)
|
|||
|
```
|
|||
|
|
|||
|
#### Стало (рекомендуется):
|
|||
|
```python
|
|||
|
# Прямое использование менеджеров
|
|||
|
from auth.tokens.sessions import SessionTokenManager
|
|||
|
from auth.tokens.verification import VerificationTokenManager
|
|||
|
from auth.tokens.oauth import OAuthTokenManager
|
|||
|
|
|||
|
# Сессии
|
|||
|
sessions = SessionTokenManager()
|
|||
|
token = await sessions.create_session(user_id, username=username)
|
|||
|
valid, data = await sessions.validate_session_token(token)
|
|||
|
await sessions.revoke_session_token(token)
|
|||
|
|
|||
|
# Токены подтверждения
|
|||
|
verification = VerificationTokenManager()
|
|||
|
token = await verification.create_verification_token(user_id, "email_change", data)
|
|||
|
valid, data = await verification.validate_verification_token(token)
|
|||
|
|
|||
|
# OAuth токены
|
|||
|
oauth = OAuthTokenManager()
|
|||
|
await oauth.store_oauth_tokens(user_id, "google", access_token, refresh_token)
|
|||
|
```
|
|||
|
|
|||
|
#### Фасад TokenStorage (для совместимости):
|
|||
|
```python
|
|||
|
# Упрощенный фасад для основных операций
|
|||
|
await TokenStorage.create_session(user_id, username=username)
|
|||
|
await TokenStorage.verify_session(token)
|
|||
|
await TokenStorage.refresh_session(user_id, old_token, device_info)
|
|||
|
await TokenStorage.revoke_session(token)
|
|||
|
```
|
|||
|
|
|||
|
### Redis Service
|
|||
|
|
|||
|
#### Обновленный API:
|
|||
|
```python
|
|||
|
from services.redis import redis
|
|||
|
|
|||
|
# Базовые операции
|
|||
|
await redis.get(key)
|
|||
|
await redis.set(key, value, ex=ttl)
|
|||
|
await redis.delete(key)
|
|||
|
await redis.exists(key)
|
|||
|
|
|||
|
# Pipeline операции
|
|||
|
async with redis.pipeline(transaction=True) as pipe:
|
|||
|
await pipe.hset(key, field, value)
|
|||
|
await pipe.expire(key, seconds)
|
|||
|
results = await pipe.execute()
|
|||
|
|
|||
|
# Новые методы
|
|||
|
await redis.scan(cursor, match=pattern, count=100)
|
|||
|
await redis.scard(key)
|
|||
|
await redis.ttl(key)
|
|||
|
await redis.info(section="memory")
|
|||
|
```
|
|||
|
|
|||
|
### Мониторинг токенов
|
|||
|
|
|||
|
#### Новые возможности:
|
|||
|
```python
|
|||
|
from auth.tokens.monitoring import TokenMonitoring
|
|||
|
|
|||
|
monitoring = TokenMonitoring()
|
|||
|
|
|||
|
# Статистика токенов
|
|||
|
stats = await monitoring.get_token_statistics()
|
|||
|
print(f"Active sessions: {stats['session_tokens']}")
|
|||
|
print(f"Memory usage: {stats['memory_usage']} bytes")
|
|||
|
|
|||
|
# Health check
|
|||
|
health = await monitoring.health_check()
|
|||
|
if health["status"] == "healthy":
|
|||
|
print("Token system is healthy")
|
|||
|
|
|||
|
# Оптимизация памяти
|
|||
|
results = await monitoring.optimize_memory_usage()
|
|||
|
print(f"Cleaned {results['cleaned_expired']} expired tokens")
|
|||
|
```
|
|||
|
|
|||
|
### Пакетные операции
|
|||
|
|
|||
|
#### Новые возможности:
|
|||
|
```python
|
|||
|
from auth.tokens.batch import BatchTokenOperations
|
|||
|
|
|||
|
batch = BatchTokenOperations()
|
|||
|
|
|||
|
# Массовая валидация
|
|||
|
tokens = ["token1", "token2", "token3"]
|
|||
|
results = await batch.batch_validate_tokens(tokens)
|
|||
|
# {"token1": True, "token2": False, "token3": True}
|
|||
|
|
|||
|
# Массовый отзыв
|
|||
|
revoked_count = await batch.batch_revoke_tokens(tokens)
|
|||
|
print(f"Revoked {revoked_count} tokens")
|
|||
|
|
|||
|
# Очистка истекших
|
|||
|
cleaned = await batch.cleanup_expired_tokens()
|
|||
|
print(f"Cleaned {cleaned} expired tokens")
|
|||
|
```
|
|||
|
|
|||
|
## Изменения в конфигурации
|
|||
|
|
|||
|
### Переменные окружения
|
|||
|
|
|||
|
#### Добавлены:
|
|||
|
```bash
|
|||
|
# Новые OAuth провайдеры
|
|||
|
VK_APP_ID=your_vk_app_id
|
|||
|
VK_APP_SECRET=your_vk_app_secret
|
|||
|
YANDEX_CLIENT_ID=your_yandex_client_id
|
|||
|
YANDEX_CLIENT_SECRET=your_yandex_client_secret
|
|||
|
|
|||
|
# Расширенные настройки Redis
|
|||
|
REDIS_SOCKET_KEEPALIVE=true
|
|||
|
REDIS_HEALTH_CHECK_INTERVAL=30
|
|||
|
REDIS_SOCKET_TIMEOUT=5
|
|||
|
```
|
|||
|
|
|||
|
#### Удалены:
|
|||
|
```bash
|
|||
|
# Больше не используются
|
|||
|
OLD_TOKEN_FORMAT_SUPPORT=true # автоматически определяется
|
|||
|
TOKEN_CLEANUP_INTERVAL=3600 # заменено на on-demand cleanup
|
|||
|
```
|
|||
|
|
|||
|
## Breaking Changes
|
|||
|
|
|||
|
### 1. Убраны deprecated методы
|
|||
|
|
|||
|
#### Удалено:
|
|||
|
```python
|
|||
|
# Эти методы больше не существуют
|
|||
|
TokenStorage.create_token() # -> используйте конкретные менеджеры
|
|||
|
TokenStorage.get_token_data() # -> используйте конкретные менеджеры
|
|||
|
TokenStorage.validate_token() # -> используйте конкретные менеджеры
|
|||
|
TokenStorage.revoke_user_tokens() # -> используйте конкретные менеджеры
|
|||
|
```
|
|||
|
|
|||
|
#### Альтернативы:
|
|||
|
```python
|
|||
|
# Для сессий
|
|||
|
sessions = SessionTokenManager()
|
|||
|
await sessions.create_session(user_id)
|
|||
|
await sessions.revoke_user_sessions(user_id)
|
|||
|
|
|||
|
# Для verification
|
|||
|
verification = VerificationTokenManager()
|
|||
|
await verification.create_verification_token(user_id, "email", data)
|
|||
|
await verification.revoke_user_verification_tokens(user_id)
|
|||
|
```
|
|||
|
|
|||
|
### 2. Изменения в compat.py
|
|||
|
|
|||
|
Файл `auth/tokens/compat.py` удален. Если вы использовали `CompatibilityMethods`:
|
|||
|
|
|||
|
#### Миграция:
|
|||
|
```python
|
|||
|
# Было
|
|||
|
from auth.tokens.compat import CompatibilityMethods
|
|||
|
compat = CompatibilityMethods()
|
|||
|
await compat.get(token_key)
|
|||
|
|
|||
|
# Стало
|
|||
|
from services.redis import redis
|
|||
|
result = await redis.get(token_key)
|
|||
|
```
|
|||
|
|
|||
|
### 3. Изменения в типах
|
|||
|
|
|||
|
#### Обновленные импорты:
|
|||
|
```python
|
|||
|
# Было
|
|||
|
from auth.tokens.storage import TokenType, TokenData
|
|||
|
|
|||
|
# Стало
|
|||
|
from auth.tokens.types import TokenType, TokenData
|
|||
|
```
|
|||
|
|
|||
|
## Рекомендации по миграции
|
|||
|
|
|||
|
### Поэтапная миграция
|
|||
|
|
|||
|
#### Шаг 1: Обновите импорты
|
|||
|
```python
|
|||
|
# Замените старые импорты
|
|||
|
from auth.tokens.sessions import SessionTokenManager
|
|||
|
from auth.tokens.verification import VerificationTokenManager
|
|||
|
from auth.tokens.oauth import OAuthTokenManager
|
|||
|
```
|
|||
|
|
|||
|
#### Шаг 2: Используйте конкретные менеджеры
|
|||
|
```python
|
|||
|
# Вместо универсального TokenStorage
|
|||
|
# используйте специализированные менеджеры
|
|||
|
sessions = SessionTokenManager()
|
|||
|
```
|
|||
|
|
|||
|
#### Шаг 3: Добавьте мониторинг
|
|||
|
```python
|
|||
|
from auth.tokens.monitoring import TokenMonitoring
|
|||
|
|
|||
|
# Добавьте health checks в ваши endpoints
|
|||
|
monitoring = TokenMonitoring()
|
|||
|
health = await monitoring.health_check()
|
|||
|
```
|
|||
|
|
|||
|
#### Шаг 4: Оптимизируйте батчевые операции
|
|||
|
```python
|
|||
|
from auth.tokens.batch import BatchTokenOperations
|
|||
|
|
|||
|
# Используйте batch операции для массовых действий
|
|||
|
batch = BatchTokenOperations()
|
|||
|
results = await batch.batch_validate_tokens(token_list)
|
|||
|
```
|
|||
|
|
|||
|
### Тестирование миграции
|
|||
|
|
|||
|
#### Checklist:
|
|||
|
- [ ] Все auth тесты проходят
|
|||
|
- [ ] mypy проверки без ошибок
|
|||
|
- [ ] OAuth провайдеры работают
|
|||
|
- [ ] Session management функционирует
|
|||
|
- [ ] Redis операции оптимизированы
|
|||
|
- [ ] Мониторинг настроен
|
|||
|
|
|||
|
#### Команды для тестирования:
|
|||
|
```bash
|
|||
|
# Проверка типов
|
|||
|
mypy .
|
|||
|
|
|||
|
# Запуск auth тестов
|
|||
|
pytest tests/auth/ -v
|
|||
|
|
|||
|
# Проверка Redis подключения
|
|||
|
python -c "
|
|||
|
import asyncio
|
|||
|
from services.redis import redis
|
|||
|
async def test():
|
|||
|
result = await redis.ping()
|
|||
|
print(f'Redis connection: {result}')
|
|||
|
asyncio.run(test())
|
|||
|
"
|
|||
|
|
|||
|
# Health check системы токенов
|
|||
|
python -c "
|
|||
|
import asyncio
|
|||
|
from auth.tokens.monitoring import TokenMonitoring
|
|||
|
async def test():
|
|||
|
health = await TokenMonitoring().health_check()
|
|||
|
print(f'Token system health: {health}')
|
|||
|
asyncio.run(test())
|
|||
|
"
|
|||
|
```
|
|||
|
|
|||
|
## Производительность
|
|||
|
|
|||
|
### Ожидаемые улучшения
|
|||
|
- **50%** ускорение Redis операций (pipeline использование)
|
|||
|
- **30%** снижение memory usage (оптимизированные структуры)
|
|||
|
- **Elimination** of proxy overhead (прямое обращение к менеджерам)
|
|||
|
- **Real-time** мониторинг и статистика
|
|||
|
|
|||
|
### Мониторинг после миграции
|
|||
|
```python
|
|||
|
# Регулярно проверяйте статистику
|
|||
|
from auth.tokens.monitoring import TokenMonitoring
|
|||
|
|
|||
|
async def check_performance():
|
|||
|
monitoring = TokenMonitoring()
|
|||
|
stats = await monitoring.get_token_statistics()
|
|||
|
|
|||
|
print(f"Session tokens: {stats['session_tokens']}")
|
|||
|
print(f"Memory usage: {stats['memory_usage'] / 1024 / 1024:.2f} MB")
|
|||
|
|
|||
|
# Оптимизация при необходимости
|
|||
|
if stats['memory_usage'] > 100 * 1024 * 1024: # 100MB
|
|||
|
results = await monitoring.optimize_memory_usage()
|
|||
|
print(f"Optimized: {results}")
|
|||
|
```
|
|||
|
|
|||
|
## Поддержка
|
|||
|
|
|||
|
Если возникли проблемы при миграции:
|
|||
|
|
|||
|
1. **Проверьте логи** - все изменения логируются
|
|||
|
2. **Запустите health check** - `TokenMonitoring().health_check()`
|
|||
|
3. **Проверьте Redis** - подключение и память
|
|||
|
4. **Откатитесь к TokenStorage фасаду** при необходимости
|
|||
|
|
|||
|
### Контакты
|
|||
|
- **Issues**: GitHub Issues
|
|||
|
- **Документация**: `/docs/auth-system.md`
|
|||
|
- **Архитектура**: `/docs/auth-architecture.md`
|