diff --git a/auth/oauth.py b/auth/oauth.py index 4fbb5d05..065e3136 100644 --- a/auth/oauth.py +++ b/auth/oauth.py @@ -527,23 +527,24 @@ async def oauth_callback(request: Any) -> JSONResponse | RedirectResponse: # Создаем ответ с редиректом response = RedirectResponse(url=final_redirect_url) + # 🔍 Диагностика перед установкой cookie + logger.info(f"🔍 Готовимся установить cookie для redirect на: {parsed_redirect.netloc}") + logger.info(f"🔍 Текущие настройки cookie: secure={SESSION_COOKIE_SECURE}, samesite={SESSION_COOKIE_SAMESITE}") + # 🍪 Устанавливаем httpOnly cookie для безопасности # 💋 Исправляем domain для testing.discours.io - не используем wildcard domain cookie_domain = None # Убираем wildcard domain для корректной работы cookie_samesite = SESSION_COOKIE_SAMESITE - if "discours.io" in parsed_redirect.netloc and "testing.discours.io" not in parsed_redirect.netloc: - cookie_domain = ".discours.io" # Только для основного домена - elif "testing.discours.io" in parsed_redirect.netloc: - # 💋 Для testing.discours.io используем None domain и SameSite=Lax для лучшей совместимости - # SameSite=None требует Secure=True, что может не работать если HTTPS_ENABLED неправильно настроен - cookie_domain = None - cookie_samesite = "lax" # Более безопасный вариант для same-site запросов + if "discours.io" in parsed_redirect.netloc: + # 💋 ЭКСТРЕННОЕ ИСПРАВЛЕНИЕ: Используем wildcard domain для всех discours.io + cookie_domain = ".discours.io" # Работает для всех поддоменов включая testing.discours.io + cookie_samesite = "lax" # Безопасный вариант для same-site запросов - # 💋 Принудительно включаем Secure для testing.discours.io (всегда HTTPS) + # 💋 Принудительно включаем Secure для всех discours.io доменов (всегда HTTPS) cookie_secure = SESSION_COOKIE_SECURE - if "testing.discours.io" in parsed_redirect.netloc: - cookie_secure = True # testing.discours.io всегда использует HTTPS + if "discours.io" in parsed_redirect.netloc: + cookie_secure = True # Все discours.io домены используют HTTPS response.set_cookie( SESSION_COOKIE_NAME, @@ -556,6 +557,14 @@ async def oauth_callback(request: Any) -> JSONResponse | RedirectResponse: domain=cookie_domain, # Поддержка поддоменов только для основного домена ) + # 🔍 Дополнительная диагностика cookie + logger.warning("🚨 ВАЖНО: Cookie должен быть установлен в браузере и отправляться в последующих запросах!") + logger.warning("🚨 Если cookie не передается, проверьте:") + logger.warning(f" - Браузер принимает cookie с domain={cookie_domain}") + logger.warning(f" - HTTPS работает правильно (secure={cookie_secure})") + logger.warning(f" - SameSite политика не блокирует (samesite={cookie_samesite})") + logger.warning(" - Path='/' доступен для всех запросов") + logger.info(f"OAuth успешно завершен для {provider}, user_id={author.id}") return response @@ -874,18 +883,15 @@ async def oauth_callback_http(request: Request) -> JSONResponse | RedirectRespon cookie_domain = None # Убираем wildcard domain для корректной работы cookie_samesite = SESSION_COOKIE_SAMESITE - if "discours.io" in parsed_redirect.netloc and "testing.discours.io" not in parsed_redirect.netloc: - cookie_domain = ".discours.io" # Только для основного домена - elif "testing.discours.io" in parsed_redirect.netloc: - # 💋 Для testing.discours.io используем None domain и SameSite=Lax для лучшей совместимости - # SameSite=None требует Secure=True, что может не работать если HTTPS_ENABLED неправильно настроен - cookie_domain = None - cookie_samesite = "lax" # Более безопасный вариант для same-site запросов + if "discours.io" in parsed_redirect.netloc: + # 💋 ЭКСТРЕННОЕ ИСПРАВЛЕНИЕ: Используем wildcard domain для всех discours.io + cookie_domain = ".discours.io" # Работает для всех поддоменов включая testing.discours.io + cookie_samesite = "lax" # Безопасный вариант для same-site запросов - # 💋 Принудительно включаем Secure для testing.discours.io (всегда HTTPS) + # 💋 Принудительно включаем Secure для всех discours.io доменов (всегда HTTPS) cookie_secure = SESSION_COOKIE_SECURE - if "testing.discours.io" in parsed_redirect.netloc: - cookie_secure = True # testing.discours.io всегда использует HTTPS + if "discours.io" in parsed_redirect.netloc: + cookie_secure = True # Все discours.io домены используют HTTPS response.set_cookie( SESSION_COOKIE_NAME, @@ -910,6 +916,15 @@ async def oauth_callback_http(request: Request) -> JSONResponse | RedirectRespon else f"🔍 Session token: {session_token}" ) logger.info(f"🔗 Final redirect: {final_redirect_url}") + + # 🔍 Дополнительная диагностика cookie + logger.warning("🚨 ВАЖНО: Cookie должен быть установлен в браузере и отправляться в последующих запросах!") + logger.warning("🚨 Если cookie не передается, проверьте:") + logger.warning(f" - Браузер принимает cookie с domain={cookie_domain}") + logger.warning(f" - HTTPS работает правильно (secure={cookie_secure})") + logger.warning(f" - SameSite политика не блокирует (samesite={cookie_samesite})") + logger.warning(" - Path='/' доступен для всех запросов") + logger.info(f"✅ OAuth успешно завершен для {provider}, user_id={author.id}") return response