2025-05-22 01:34:30 +00:00
|
|
|
|
from ariadne.asgi.handlers import GraphQLHTTPHandler
|
|
|
|
|
from starlette.requests import Request
|
2025-06-01 23:56:11 +00:00
|
|
|
|
from starlette.responses import JSONResponse
|
2025-05-29 09:37:39 +00:00
|
|
|
|
|
2025-05-22 01:34:30 +00:00
|
|
|
|
from auth.middleware import auth_middleware
|
|
|
|
|
from utils.logger import root_logger as logger
|
|
|
|
|
|
2025-05-29 09:37:39 +00:00
|
|
|
|
|
2025-05-22 01:34:30 +00:00
|
|
|
|
class EnhancedGraphQLHTTPHandler(GraphQLHTTPHandler):
|
|
|
|
|
"""
|
|
|
|
|
Улучшенный GraphQL HTTP обработчик с поддержкой cookie и авторизации.
|
2025-05-29 09:37:39 +00:00
|
|
|
|
|
2025-05-22 01:34:30 +00:00
|
|
|
|
Расширяет стандартный GraphQLHTTPHandler для:
|
|
|
|
|
1. Создания расширенного контекста запроса с авторизационными данными
|
|
|
|
|
2. Корректной обработки ответов с cookie и headers
|
|
|
|
|
3. Интеграции с AuthMiddleware
|
|
|
|
|
"""
|
2025-05-29 09:37:39 +00:00
|
|
|
|
|
2025-05-22 01:34:30 +00:00
|
|
|
|
async def get_context_for_request(self, request: Request, data: dict) -> dict:
|
|
|
|
|
"""
|
|
|
|
|
Расширяем контекст для GraphQL запросов.
|
2025-05-29 09:37:39 +00:00
|
|
|
|
|
2025-05-22 01:34:30 +00:00
|
|
|
|
Добавляет к стандартному контексту:
|
|
|
|
|
- Объект response для установки cookie
|
|
|
|
|
- Интеграцию с AuthMiddleware
|
|
|
|
|
- Расширения для управления авторизацией
|
2025-05-29 09:37:39 +00:00
|
|
|
|
|
2025-05-22 01:34:30 +00:00
|
|
|
|
Args:
|
|
|
|
|
request: Starlette Request объект
|
|
|
|
|
data: данные запроса
|
2025-05-29 09:37:39 +00:00
|
|
|
|
|
2025-05-22 01:34:30 +00:00
|
|
|
|
Returns:
|
|
|
|
|
dict: контекст с дополнительными данными для авторизации и cookie
|
|
|
|
|
"""
|
|
|
|
|
# Получаем стандартный контекст от базового класса
|
|
|
|
|
context = await super().get_context_for_request(request, data)
|
2025-05-29 09:37:39 +00:00
|
|
|
|
|
2025-05-22 01:34:30 +00:00
|
|
|
|
# Создаем объект ответа для установки cookie
|
|
|
|
|
response = JSONResponse({})
|
|
|
|
|
context["response"] = response
|
2025-05-29 09:37:39 +00:00
|
|
|
|
|
2025-05-22 01:34:30 +00:00
|
|
|
|
# Интегрируем с AuthMiddleware
|
|
|
|
|
auth_middleware.set_context(context)
|
|
|
|
|
context["extensions"] = auth_middleware
|
2025-05-29 09:37:39 +00:00
|
|
|
|
|
2025-05-22 01:34:30 +00:00
|
|
|
|
# Добавляем данные авторизации только если они доступны
|
2025-06-16 17:20:23 +00:00
|
|
|
|
# Проверяем наличие данных авторизации в scope
|
|
|
|
|
if hasattr(request, "scope") and isinstance(request.scope, dict) and "auth" in request.scope:
|
|
|
|
|
auth_cred = request.scope.get("auth")
|
|
|
|
|
context["auth"] = auth_cred
|
2025-05-22 01:34:30 +00:00
|
|
|
|
# Безопасно логируем информацию о типе объекта auth
|
2025-06-16 17:20:23 +00:00
|
|
|
|
logger.debug(f"[graphql] Добавлены данные авторизации в контекст из scope: {type(auth_cred).__name__}")
|
2025-05-29 09:37:39 +00:00
|
|
|
|
|
2025-06-01 23:56:11 +00:00
|
|
|
|
logger.debug("[graphql] Подготовлен расширенный контекст для запроса")
|
2025-05-29 09:37:39 +00:00
|
|
|
|
|
2025-05-22 01:34:30 +00:00
|
|
|
|
return context
|