core/auth/handler.py

57 lines
2.7 KiB
Python
Raw Normal View History

2025-05-22 01:34:30 +00:00
from ariadne.asgi.handlers import GraphQLHTTPHandler
from starlette.requests import Request
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
# Добавляем данные авторизации только если они доступны
# Без проверки hasattr, так как это вызывает ошибку до обработки AuthenticationMiddleware
if hasattr(request, "auth") and request.auth:
# Используем request.auth вместо request.user, так как user еще не доступен
context["auth"] = request.auth
# Безопасно логируем информацию о типе объекта auth
logger.debug(f"[graphql] Добавлены данные авторизации в контекст: {type(request.auth).__name__}")
2025-05-29 09:37:39 +00:00
logger.debug("[graphql] Подготовлен расширенный контекст для запроса")
2025-05-29 09:37:39 +00:00
2025-05-22 01:34:30 +00:00
return context