115 lines
4.3 KiB
Python
115 lines
4.3 KiB
Python
|
"""
|
|||
|
Простой интерфейс для системы токенов
|
|||
|
"""
|
|||
|
|
|||
|
from typing import Any, Optional
|
|||
|
|
|||
|
from .batch import BatchTokenOperations
|
|||
|
from .monitoring import TokenMonitoring
|
|||
|
from .oauth import OAuthTokenManager
|
|||
|
from .sessions import SessionTokenManager
|
|||
|
from .verification import VerificationTokenManager
|
|||
|
|
|||
|
|
|||
|
class _TokenStorageImpl:
|
|||
|
"""
|
|||
|
Внутренний класс для фасада токенов.
|
|||
|
Использует композицию вместо наследования.
|
|||
|
"""
|
|||
|
|
|||
|
def __init__(self) -> None:
|
|||
|
self._sessions = SessionTokenManager()
|
|||
|
self._verification = VerificationTokenManager()
|
|||
|
self._oauth = OAuthTokenManager()
|
|||
|
self._batch = BatchTokenOperations()
|
|||
|
self._monitoring = TokenMonitoring()
|
|||
|
|
|||
|
# === МЕТОДЫ ДЛЯ СЕССИЙ ===
|
|||
|
|
|||
|
async def create_session(
|
|||
|
self,
|
|||
|
user_id: str,
|
|||
|
auth_data: Optional[dict] = None,
|
|||
|
username: Optional[str] = None,
|
|||
|
device_info: Optional[dict] = None,
|
|||
|
) -> str:
|
|||
|
"""Создание сессии пользователя"""
|
|||
|
return await self._sessions.create_session(user_id, auth_data, username, device_info)
|
|||
|
|
|||
|
async def verify_session(self, token: str) -> Optional[Any]:
|
|||
|
"""Проверка сессии по токену"""
|
|||
|
return await self._sessions.verify_session(token)
|
|||
|
|
|||
|
async def refresh_session(self, user_id: int, old_token: str, device_info: Optional[dict] = None) -> Optional[str]:
|
|||
|
"""Обновление сессии пользователя"""
|
|||
|
return await self._sessions.refresh_session(user_id, old_token, device_info)
|
|||
|
|
|||
|
async def revoke_session(self, session_token: str) -> bool:
|
|||
|
"""Отзыв сессии"""
|
|||
|
return await self._sessions.revoke_session_token(session_token)
|
|||
|
|
|||
|
async def revoke_user_sessions(self, user_id: str) -> int:
|
|||
|
"""Отзыв всех сессий пользователя"""
|
|||
|
return await self._sessions.revoke_user_sessions(user_id)
|
|||
|
|
|||
|
# === ВСПОМОГАТЕЛЬНЫЕ МЕТОДЫ ===
|
|||
|
|
|||
|
async def cleanup_expired_tokens(self) -> int:
|
|||
|
"""Очистка истекших токенов"""
|
|||
|
return await self._batch.cleanup_expired_tokens()
|
|||
|
|
|||
|
async def get_token_statistics(self) -> dict:
|
|||
|
"""Получение статистики токенов"""
|
|||
|
return await self._monitoring.get_token_statistics()
|
|||
|
|
|||
|
|
|||
|
# Глобальный экземпляр фасада
|
|||
|
_token_storage = _TokenStorageImpl()
|
|||
|
|
|||
|
|
|||
|
class TokenStorage:
|
|||
|
"""
|
|||
|
Статический фасад для системы токенов.
|
|||
|
Все методы делегируются глобальному экземпляру.
|
|||
|
"""
|
|||
|
|
|||
|
@staticmethod
|
|||
|
async def create_session(
|
|||
|
user_id: str,
|
|||
|
auth_data: Optional[dict] = None,
|
|||
|
username: Optional[str] = None,
|
|||
|
device_info: Optional[dict] = None,
|
|||
|
) -> str:
|
|||
|
"""Создание сессии пользователя"""
|
|||
|
return await _token_storage.create_session(user_id, auth_data, username, device_info)
|
|||
|
|
|||
|
@staticmethod
|
|||
|
async def verify_session(token: str) -> Optional[Any]:
|
|||
|
"""Проверка сессии по токену"""
|
|||
|
return await _token_storage.verify_session(token)
|
|||
|
|
|||
|
@staticmethod
|
|||
|
async def refresh_session(user_id: int, old_token: str, device_info: Optional[dict] = None) -> Optional[str]:
|
|||
|
"""Обновление сессии пользователя"""
|
|||
|
return await _token_storage.refresh_session(user_id, old_token, device_info)
|
|||
|
|
|||
|
@staticmethod
|
|||
|
async def revoke_session(session_token: str) -> bool:
|
|||
|
"""Отзыв сессии"""
|
|||
|
return await _token_storage.revoke_session(session_token)
|
|||
|
|
|||
|
@staticmethod
|
|||
|
async def revoke_user_sessions(user_id: str) -> int:
|
|||
|
"""Отзыв всех сессий пользователя"""
|
|||
|
return await _token_storage.revoke_user_sessions(user_id)
|
|||
|
|
|||
|
@staticmethod
|
|||
|
async def cleanup_expired_tokens() -> int:
|
|||
|
"""Очистка истекших токенов"""
|
|||
|
return await _token_storage.cleanup_expired_tokens()
|
|||
|
|
|||
|
@staticmethod
|
|||
|
async def get_token_statistics() -> dict:
|
|||
|
"""Получение статистики токенов"""
|
|||
|
return await _token_storage.get_token_statistics()
|