cookie-debug
All checks were successful
Deploy on push / deploy (push) Successful in 2m48s

This commit is contained in:
2025-09-27 20:17:00 +03:00
parent 19e0092a83
commit c46b30a671
4 changed files with 106 additions and 31 deletions

View File

@@ -528,15 +528,32 @@ async def oauth_callback(request: Any) -> JSONResponse | RedirectResponse:
response = RedirectResponse(url=final_redirect_url)
# 🍪 Устанавливаем 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 запросов
# 💋 Принудительно включаем Secure для testing.discours.io (всегда HTTPS)
cookie_secure = SESSION_COOKIE_SECURE
if "testing.discours.io" in parsed_redirect.netloc:
cookie_secure = True # testing.discours.io всегда использует HTTPS
response.set_cookie(
SESSION_COOKIE_NAME,
session_token,
httponly=SESSION_COOKIE_HTTPONLY,
secure=SESSION_COOKIE_SECURE,
samesite=SESSION_COOKIE_SAMESITE,
secure=cookie_secure,
samesite=cookie_samesite,
max_age=SESSION_COOKIE_MAX_AGE,
path="/", # Важно: устанавливаем path="/" для доступности cookie во всех путях
domain=".discours.io" if "discours.io" in parsed_redirect.netloc else None, # Поддержка поддоменов
domain=cookie_domain, # Поддержка поддоменов только для основного домена
)
logger.info(f"OAuth успешно завершен для {provider}, user_id={author.id}")
@@ -853,20 +870,44 @@ async def oauth_callback_http(request: Request) -> JSONResponse | RedirectRespon
response = RedirectResponse(url=final_redirect_url, status_code=307)
# 🍪 Устанавливаем httpOnly cookie для безопасности
cookie_domain = ".discours.io" if "discours.io" in parsed_redirect.netloc else None
# 💋 Исправляем 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 запросов
# 💋 Принудительно включаем Secure для testing.discours.io (всегда HTTPS)
cookie_secure = SESSION_COOKIE_SECURE
if "testing.discours.io" in parsed_redirect.netloc:
cookie_secure = True # testing.discours.io всегда использует HTTPS
response.set_cookie(
SESSION_COOKIE_NAME,
session_token,
httponly=SESSION_COOKIE_HTTPONLY,
secure=SESSION_COOKIE_SECURE,
samesite=SESSION_COOKIE_SAMESITE,
secure=cookie_secure,
samesite=cookie_samesite,
max_age=SESSION_COOKIE_MAX_AGE,
path="/", # Важно: устанавливаем path="/" для доступности cookie во всех путях
domain=cookie_domain, # Поддержка поддоменов
domain=cookie_domain, # Поддержка поддоменов только для основного домена
)
logger.info(
f"🍪 Cookie установлен: name={SESSION_COOKIE_NAME}, domain={cookie_domain}, secure={SESSION_COOKIE_SECURE}"
f"🍪 Cookie установлен: name={SESSION_COOKIE_NAME}, domain={cookie_domain}, secure={cookie_secure}, samesite={cookie_samesite}"
)
logger.info(
f"🔍 Cookie debug: redirect_netloc={parsed_redirect.netloc}, is_testing={('testing.discours.io' in parsed_redirect.netloc)}"
)
logger.info(
f"🔍 Session token preview: {session_token[:30]}..."
if len(session_token) > 30
else f"🔍 Session token: {session_token}"
)
logger.info(f"🔗 Final redirect: {final_redirect_url}")
logger.info(f"✅ OAuth успешно завершен для {provider}, user_id={author.id}")