[0.9.25] - 2025-01-25
Some checks failed
Deploy on push / deploy (push) Failing after 24s

### Added
- 🔍 **OAuth Detailed Logging**: Добавлено пошаговое логирование OAuth callback для диагностики ошибок `auth_failed`
- 🧪 **OAuth Diagnostic Tools**: Создан `oauth_debug.py` для анализа OAuth callback параметров и диагностики проблем
- 📊 **OAuth Test Helper**: Добавлен `oauth_test_helper.py` для создания тестовых состояний OAuth в Redis
- 🔧 **OAuth Provider Detection**: Автоматическое определение OAuth провайдера по формату authorization code

### Fixed
- 🚨 **OAuth Callback Error Handling**: Улучшена обработка исключений в OAuth callback с детальным логированием каждого шага
- 🔍 **OAuth Exception Tracking**: Добавлено логирование исключений на каждом этапе: token exchange, profile fetch, user creation, session creation
- 📋 **OAuth Error Diagnosis**: Реализована система диагностики для выявления точной причины `error=auth_failed` редиректов

### Changed
- 🔧 **OAuth Callback Flow**: Разделен OAuth callback на логические шаги с индивидуальным error handling
- 📝 **OAuth Error Messages**: Улучшены сообщения об ошибках для более точной диагностики проблем
This commit is contained in:
2025-09-25 08:48:36 +03:00
parent 2ce8a5b957
commit 34738ae611
7 changed files with 765 additions and 650 deletions

View File

@@ -15,7 +15,8 @@ _lib_path = Path(__file__).parents[1]
_leng_path = len(_lib_path.as_posix())
def filter(record: logging.LogRecord) -> bool:
def console_filter(record: logging.LogRecord) -> bool:
"""🔍 Фильтр для консольного вывода - подавляет спам авторизации"""
# Define `package` attribute with the relative path.
record.package = record.pathname[_leng_path + 1 :].replace(".py", "")
record.emoji = (
@@ -32,10 +33,10 @@ def filter(record: logging.LogRecord) -> bool:
else ""
)
# Подавляем логи ошибок авторизации и GraphQL трейсбеки
# 🚫 Подавляем логи ошибок авторизации ТОЛЬКО в консоли (не в Sentry)
if record.levelno >= logging.ERROR and record.getMessage():
message = record.getMessage()
# Подавляем ошибки авторизации
# Подавляем ошибки авторизации в консоли
if any(
phrase in message
for phrase in [
@@ -60,9 +61,9 @@ def filter(record: logging.LogRecord) -> bool:
"decorated_function",
]
):
return False # Не логируем ошибки авторизации и их трейсбеки
return False # Не показываем в консоли ошибки авторизации
# Подавляем повторяющиеся Ariadne логи
# Подавляем повторяющиеся Ariadne логи в консоли
if record.name in ["ariadne", "graphql"]:
message = record.getMessage()
if any(
@@ -79,6 +80,26 @@ def filter(record: logging.LogRecord) -> bool:
return True
def basic_filter(record: logging.LogRecord) -> bool:
"""🔍 Базовый фильтр для всех логов - только добавляет метаданные"""
# Define `package` attribute with the relative path.
record.package = record.pathname[_leng_path + 1 :].replace(".py", "")
record.emoji = (
"🔍"
if record.levelno == logging.DEBUG
else ""
if record.levelno == logging.INFO
else "🚧"
if record.levelno == logging.WARNING
else ""
if record.levelno == logging.ERROR
else "🧨"
if record.levelno == logging.CRITICAL
else ""
)
return True
# Define the color scheme
color_scheme = {
"DEBUG": "light_black",
@@ -141,9 +162,10 @@ class MultilineColoredFormatter(colorlog.ColoredFormatter):
# Create a MultilineColoredFormatter object for colorized logging
formatter = MultilineColoredFormatter(fmt_string, **fmt_config)
# Create a stream handler for logging output
# Create a stream handler for logging output (только для консоли)
stream = logging.StreamHandler()
stream.setFormatter(formatter)
stream.addFilter(console_filter) # 🔍 Применяем фильтр только к консольному выводу
def get_colorful_logger(name: str = "main") -> logging.Logger:
@@ -151,7 +173,7 @@ def get_colorful_logger(name: str = "main") -> logging.Logger:
logger = logging.getLogger(name)
logger.setLevel(logging.DEBUG)
logger.addHandler(stream)
logger.addFilter(filter)
logger.addFilter(basic_filter) # 🔍 Базовый фильтр без подавления
return logger
@@ -160,7 +182,7 @@ def get_colorful_logger(name: str = "main") -> logging.Logger:
root_logger = logging.getLogger()
root_logger.setLevel(logging.DEBUG)
root_logger.addHandler(stream)
root_logger.addFilter(filter)
root_logger.addFilter(basic_filter) # 🔍 Базовый фильтр - позволяет Sentry получать все логи
ignore_logs = ["_trace", "httpx", "_client", "atrace", "aiohttp", "_client", "ariadne", "graphql"]
for lgr in ignore_logs: