From fb6ef4272db2ab477615133ef87991d63214e02d Mon Sep 17 00:00:00 2001 From: Untone Date: Fri, 25 Jul 2025 10:10:36 +0300 Subject: [PATCH] failed-auth-lesslog --- auth/decorators.py | 18 ++++++++++++++---- auth/internal.py | 4 ++-- main.py | 13 +++++++++---- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/auth/decorators.py b/auth/decorators.py index 2798eaec..b137d5bd 100644 --- a/auth/decorators.py +++ b/auth/decorators.py @@ -180,14 +180,24 @@ async def validate_graphql_context(info: GraphQLResolveInfo) -> None: # Если авторизации нет ни в auth, ни в scope, пробуем получить и проверить токен token = get_auth_token(request) if not token: - # Если токен не найден, бросаем ошибку авторизации + # Если токен не найден, логируем как предупреждение, но не бросаем GraphQLError client_info = { "ip": getattr(request.client, "host", "unknown") if hasattr(request, "client") else "unknown", "headers": {k: v for k, v in get_safe_headers(request).items() if k not in ["authorization", "cookie"]}, } - logger.warning(f"[validate_graphql_context] Токен авторизации не найден: {client_info}") - msg = "Unauthorized - please login" - raise GraphQLError(msg) + logger.info(f"[validate_graphql_context] Токен авторизации не найден: {client_info}") + + # Устанавливаем пустые учетные данные вместо выброса исключения + if hasattr(request, "scope") and isinstance(request.scope, dict): + request.scope["auth"] = AuthCredentials( + author_id=None, + scopes={}, + logged_in=False, + error_message="No authentication token", + email=None, + token=None, + ) + return # Логируем информацию о найденном токене logger.debug(f"[validate_graphql_context] Токен найден, длина: {len(token)}") diff --git a/auth/internal.py b/auth/internal.py index ce40c9be..dbeb37fe 100644 --- a/auth/internal.py +++ b/auth/internal.py @@ -119,8 +119,8 @@ async def authenticate(request) -> AuthState: # Получаем токен из запроса token = get_auth_token(request) if not token: - logger.warning("[authenticate] Токен не найден в запросе") - auth_state.error = "No authentication token provided" + logger.info("[authenticate] Токен не найден в запросе") + auth_state.error = "No authentication token" return auth_state logger.debug(f"[authenticate] Токен найден, длина: {len(token)}") diff --git a/main.py b/main.py index e233483b..f848410d 100644 --- a/main.py +++ b/main.py @@ -6,6 +6,7 @@ from pathlib import Path from ariadne import load_schema_from_path, make_executable_schema from ariadne.asgi import GraphQL +from ariadne.graphql_core.error import GraphQLError from starlette.applications import Starlette from starlette.middleware import Middleware from starlette.middleware.cors import CORSMiddleware @@ -96,13 +97,17 @@ async def graphql_handler(request: Request) -> Response: return await auth_middleware.process_result(request, result) except asyncio.CancelledError: return JSONResponse({"error": "Request cancelled"}, status_code=499) + except GraphQLError as e: + # Для GraphQL ошибок (например, неавторизованный доступ) не логируем полный трейс + logger.warning(f"GraphQL error: {e}") + return JSONResponse({"error": str(e)}, status_code=403) except Exception as e: - logger.error(f"GraphQL error: {e!s}") - # Логируем более подробную информацию для отладки + logger.error(f"Unexpected GraphQL error: {e!s}") + # Логируем более подробную информацию для отладки только для неожиданных ошибок import traceback - logger.debug(f"GraphQL error traceback: {traceback.format_exc()}") - return JSONResponse({"error": str(e)}, status_code=500) + logger.debug(f"Unexpected GraphQL error traceback: {traceback.format_exc()}") + return JSONResponse({"error": "Internal server error"}, status_code=500) async def spa_handler(request: Request) -> Response: