From 94798f4d8b1a4470b85de931f98db4747accc1b8 Mon Sep 17 00:00:00 2001 From: glpshchn <464976@niuitmo.ru> Date: Mon, 15 Dec 2025 03:47:02 +0300 Subject: [PATCH] Update files --- moderation/backend-py/config.py | 11 +++++++ .../backend-py/routes/moderation_auth.py | 12 ++++++++ moderation/backend-py/utils/email_service.py | 29 +++++++++++++++++++ .../backend-py/utils/telegram_initdata.py | 4 +-- moderation/frontend/src/App.jsx | 4 +++ 5 files changed, 58 insertions(+), 2 deletions(-) diff --git a/moderation/backend-py/config.py b/moderation/backend-py/config.py index 099a131..f899ec1 100644 --- a/moderation/backend-py/config.py +++ b/moderation/backend-py/config.py @@ -28,6 +28,17 @@ elif root_env_path.exists(): else: print(f"⚠️ .env file not found at: {root_env_path} or {docker_env_path}") +# Debug: Print email-related env vars +print(f"[Config] 🔍 Email настройки из .env:") +print(f"[Config] EMAIL_PROVIDER (raw): '{os.getenv('EMAIL_PROVIDER', 'NOT SET')}'") +print(f"[Config] EMAIL_FROM: '{os.getenv('EMAIL_FROM', 'NOT SET')}'") +print(f"[Config] AWS_SES_ACCESS_KEY_ID: {'SET' if os.getenv('AWS_SES_ACCESS_KEY_ID') else 'NOT SET'}") +print(f"[Config] AWS_SES_SECRET_ACCESS_KEY: {'SET' if os.getenv('AWS_SES_SECRET_ACCESS_KEY') else 'NOT SET'}") +print(f"[Config] AWS_SES_REGION: '{os.getenv('AWS_SES_REGION', 'NOT SET')}'") +print(f"[Config] AWS_SES_ENDPOINT_URL: '{os.getenv('AWS_SES_ENDPOINT_URL', 'NOT SET')}'") +print(f"[Config] YANDEX_SMTP_USER: {'SET' if os.getenv('YANDEX_SMTP_USER') else 'NOT SET'}") +print(f"[Config] YANDEX_SMTP_PASSWORD: {'SET' if os.getenv('YANDEX_SMTP_PASSWORD') else 'NOT SET'}") + class Settings(BaseSettings): """Application settings""" diff --git a/moderation/backend-py/routes/moderation_auth.py b/moderation/backend-py/routes/moderation_auth.py index 688b3f6..4d219f8 100644 --- a/moderation/backend-py/routes/moderation_auth.py +++ b/moderation/backend-py/routes/moderation_auth.py @@ -111,9 +111,18 @@ async def send_code(request: SendCodeRequest, http_request: Request = None): # Send code via email try: + print(f"[ModerationAuth] 📧 Попытка отправить код на {email_lower}") + print(f"[ModerationAuth] 📧 Код: {code}") + print(f"[ModerationAuth] 📧 EMAIL_PROVIDER из settings: '{settings.EMAIL_PROVIDER}'") + print(f"[ModerationAuth] 📧 EMAIL_FROM: '{settings.EMAIL_FROM}'") + await send_verification_code(email_lower, code) + print(f"[ModerationAuth] ✅ Код успешно отправлен на {email_lower}") return {"success": True, "message": "Код подтверждения отправлен на email"} except ValueError as email_error: + print(f"[ModerationAuth] ❌ ValueError при отправке email: {email_error}") + import traceback + traceback.print_exc() # Delete code if email failed await email_verification_codes_collection().delete_many({ 'email': email_lower, @@ -124,6 +133,9 @@ async def send_code(request: SendCodeRequest, http_request: Request = None): detail=str(email_error) ) except Exception as email_error: + print(f"[ModerationAuth] ❌ Exception при отправке email: {type(email_error).__name__}: {email_error}") + import traceback + traceback.print_exc() await email_verification_codes_collection().delete_many({ 'email': email_lower, 'code': code diff --git a/moderation/backend-py/utils/email_service.py b/moderation/backend-py/utils/email_service.py index 3ebc165..44e0172 100644 --- a/moderation/backend-py/utils/email_service.py +++ b/moderation/backend-py/utils/email_service.py @@ -224,16 +224,45 @@ async def send_email(to: str, subject: str, html: str, text: Optional[str] = Non """Send email using configured provider (AWS SES or SMTP)""" email_provider = settings.EMAIL_PROVIDER.lower() + logger.info(f"[Email] 🔍 Начало отправки email") + logger.info(f"[Email] Provider из настроек: '{settings.EMAIL_PROVIDER}' (lowercase: '{email_provider}')") + logger.info(f"[Email] To: {to}") + logger.info(f"[Email] From: {settings.EMAIL_FROM}") + logger.info(f"[Email] Subject: {subject}") + if email_provider == 'aws': + logger.info(f"[Email] Выбран AWS SES") + logger.info(f"[Email] AWS_SES_ACCESS_KEY_ID: {'установлен' if settings.AWS_SES_ACCESS_KEY_ID else 'НЕ УСТАНОВЛЕН'}") + logger.info(f"[Email] AWS_SES_SECRET_ACCESS_KEY: {'установлен' if settings.AWS_SES_SECRET_ACCESS_KEY else 'НЕ УСТАНОВЛЕН'}") + logger.info(f"[Email] AWS_SES_REGION: {settings.AWS_SES_REGION}") + logger.info(f"[Email] AWS_SES_ENDPOINT_URL: {settings.AWS_SES_ENDPOINT_URL or 'не установлен'}") return await send_email_aws_ses(to, subject, html, text) elif email_provider in ['yandex', 'smtp']: + logger.info(f"[Email] Выбран SMTP ({email_provider})") + logger.info(f"[Email] YANDEX_SMTP_USER: {'установлен' if settings.YANDEX_SMTP_USER else 'НЕ УСТАНОВЛЕН'}") + logger.info(f"[Email] YANDEX_SMTP_PASSWORD: {'установлен' if settings.YANDEX_SMTP_PASSWORD else 'НЕ УСТАНОВЛЕН'}") + logger.info(f"[Email] YANDEX_SMTP_HOST: {settings.YANDEX_SMTP_HOST}") + logger.info(f"[Email] YANDEX_SMTP_PORT: {settings.YANDEX_SMTP_PORT}") return await send_email_smtp(to, subject, html, text) else: + logger.error(f"[Email] ❌ Неподдерживаемый провайдер: '{settings.EMAIL_PROVIDER}'") raise ValueError(f"Email provider '{settings.EMAIL_PROVIDER}' не поддерживается. Используйте 'aws', 'yandex' или 'smtp'") async def send_verification_code(email: str, code: str): """Send verification code to email""" + logger.info(f"[Email] 📧 send_verification_code вызван для {email}") + logger.info(f"[Email] 📧 Проверка настроек перед отправкой:") + logger.info(f"[Email] 📧 EMAIL_PROVIDER (raw): '{settings.EMAIL_PROVIDER}'") + logger.info(f"[Email] 📧 EMAIL_PROVIDER (lower): '{settings.EMAIL_PROVIDER.lower()}'") + logger.info(f"[Email] 📧 EMAIL_FROM: '{settings.EMAIL_FROM}'") + logger.info(f"[Email] 📧 AWS_SES_ACCESS_KEY_ID: {'установлен' if settings.AWS_SES_ACCESS_KEY_ID else 'НЕ УСТАНОВЛЕН'}") + logger.info(f"[Email] 📧 AWS_SES_SECRET_ACCESS_KEY: {'установлен' if settings.AWS_SES_SECRET_ACCESS_KEY else 'НЕ УСТАНОВЛЕН'}") + logger.info(f"[Email] 📧 AWS_SES_REGION: '{settings.AWS_SES_REGION}'") + logger.info(f"[Email] 📧 AWS_SES_ENDPOINT_URL: '{settings.AWS_SES_ENDPOINT_URL}'") + logger.info(f"[Email] 📧 YANDEX_SMTP_USER: {'установлен' if settings.YANDEX_SMTP_USER else 'НЕ УСТАНОВЛЕН'}") + logger.info(f"[Email] 📧 YANDEX_SMTP_PASSWORD: {'установлен' if settings.YANDEX_SMTP_PASSWORD else 'НЕ УСТАНОВЛЕН'}") + subject = "Код подтверждения регистрации - Nakama" html = generate_verification_email(code) text = f"Ваш код подтверждения: {code}. Код действителен 15 минут." diff --git a/moderation/backend-py/utils/telegram_initdata.py b/moderation/backend-py/utils/telegram_initdata.py index ffacc97..0ff0b90 100644 --- a/moderation/backend-py/utils/telegram_initdata.py +++ b/moderation/backend-py/utils/telegram_initdata.py @@ -7,8 +7,8 @@ import urllib.parse from typing import Optional, Dict, Any from config import settings -MAX_AUTH_AGE_SECONDS = 60 * 60 * 24 # 24 часа (увеличено для модерации) -AUTH_AGE_TOLERANCE_SECONDS = 60 * 60 # 1 час допуск +MAX_AUTH_AGE_SECONDS = 60 * 60 * 24 * 7 # 7 дней (увеличено для модерации) +AUTH_AGE_TOLERANCE_SECONDS = 60 * 60 * 24 # 24 часа допуск (увеличено для избежания "сессия устарела") def validate_init_data(init_data_raw: str, bot_token: Optional[str] = None) -> Dict[str, Any]: diff --git a/moderation/frontend/src/App.jsx b/moderation/frontend/src/App.jsx index 0ab15c9..fbd3088 100644 --- a/moderation/frontend/src/App.jsx +++ b/moderation/frontend/src/App.jsx @@ -315,6 +315,10 @@ export default function App() { script.setAttribute('data-request-access', 'write'); script.setAttribute('data-onauth', 'onTelegramAuth'); script.setAttribute('data-radius', '10'); + // Добавить auth-url для валидации домена + const API_URL = getApiUrl(); + const fullApiUrl = API_URL.startsWith('http') ? API_URL : `${window.location.origin}${API_URL}`; + script.setAttribute('data-auth-url', `${fullApiUrl}/moderation-auth/telegram-widget`); script.onload = () => { console.log('[Telegram Widget] Скрипт загружен');