diff --git a/backend/middleware/rateLimiter.js b/backend/middleware/rateLimiter.js index ff39190..1f18dd0 100644 --- a/backend/middleware/rateLimiter.js +++ b/backend/middleware/rateLimiter.js @@ -2,7 +2,7 @@ const rateLimit = require('express-rate-limit'); // Общий лимит для API const generalLimiter = rateLimit({ - windowMs: 15 * 60 * 1000, // 15 минут + windowMs: 15 * 1000, // 15 секунд max: 100, // 100 запросов message: 'Слишком много запросов, попробуйте позже', standardHeaders: true, @@ -11,29 +11,29 @@ const generalLimiter = rateLimit({ // Строгий лимит для создания постов const postCreationLimiter = rateLimit({ - windowMs: 60 * 60 * 1000, // 1 час - max: 10, // 10 постов в час + windowMs: 15 * 1000, // 15 секунд + max: 10, // 10 постов message: 'Вы создаёте слишком много постов, подождите немного', skipSuccessfulRequests: true, }); // Лимит для авторизации const authLimiter = rateLimit({ - windowMs: 15 * 60 * 1000, // 15 минут + windowMs: 15 * 1000, // 15 секунд max: 5, // 5 попыток message: 'Слишком много попыток авторизации', }); // Лимит для поиска const searchLimiter = rateLimit({ - windowMs: 60 * 1000, // 1 минута + windowMs: 15 * 1000, // 15 секунд max: 30, // 30 запросов message: 'Слишком много поисковых запросов', }); // Лимит для лайков/комментариев (защита от спама) const interactionLimiter = rateLimit({ - windowMs: 60 * 1000, // 1 минута + windowMs: 15 * 1000, // 15 секунд max: 20, // 20 действий message: 'Вы слишком активны, немного подождите', }); diff --git a/backend/middleware/security.js b/backend/middleware/security.js index b080a83..67feb7c 100644 --- a/backend/middleware/security.js +++ b/backend/middleware/security.js @@ -47,7 +47,7 @@ const hppProtection = hpp(); // Строгий rate limit для авторизации const strictAuthLimiter = rateLimit({ - windowMs: 15 * 60 * 1000, // 15 минут + windowMs: 15 * 1000, // 15 секунд max: 5, // 5 попыток message: 'Слишком много попыток авторизации, попробуйте позже', standardHeaders: true, @@ -57,7 +57,7 @@ const strictAuthLimiter = rateLimit({ // Rate limit для создания постов (защита от спама) const strictPostLimiter = rateLimit({ - windowMs: 60 * 60 * 1000, // 1 час + windowMs: 15 * 1000, // 15 секунд max: 10, // 10 постов message: 'Превышен лимит создания постов, попробуйте позже', standardHeaders: true, @@ -67,7 +67,7 @@ const strictPostLimiter = rateLimit({ // Rate limit для файлов const fileUploadLimiter = rateLimit({ - windowMs: 60 * 60 * 1000, // 1 час + windowMs: 15 * 1000, // 15 секунд max: 50, // 50 загрузок message: 'Превышен лимит загрузки файлов', standardHeaders: true, @@ -76,8 +76,8 @@ const fileUploadLimiter = rateLimit({ // DDoS защита - агрессивный rate limit const ddosProtection = rateLimit({ - windowMs: 60 * 1000, // 1 минута - max: 100, // 100 запросов в минуту + windowMs: 15 * 1000, // 15 секунд + max: 100, // 100 запросов message: 'Слишком много запросов, попробуйте позже', standardHeaders: true, legacyHeaders: false, diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 7959a53..6094441 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -41,40 +41,43 @@ function App() { return } - // Получить данные пользователя из Telegram - let telegramUser = getTelegramUser() + // В официальном клиенте Telegram есть initData (даже если user еще не распарсен) + // Пробуем авторизоваться через API - backend распарсит initData - // Если нет пользователя в initData, но есть WebApp API - дать время на инициализацию - if (!telegramUser) { - // Дать немного времени на инициализацию (Telegram Web App может загружаться асинхронно) - await new Promise(resolve => setTimeout(resolve, 200)) - telegramUser = getTelegramUser() - - // Если все еще нет пользователя, показываем Login Widget - if (!telegramUser) { + // Дать время на полную инициализацию Telegram Web App + await new Promise(resolve => setTimeout(resolve, 300)) + + // Проверить наличие initData (главный индикатор что мы в Telegram) + const initData = tg.initData || '' + + if (initData) { + // Есть initData - пробуем авторизоваться через API + try { + const userData = await verifyAuth() + setUser(userData) + + // Обработать параметр start из Telegram + if (tg?.startParam?.startsWith('post_')) { + const postId = tg.startParam.replace('post_', '') + window.location.href = `/feed?post=${postId}` + } + return + } catch (authError) { + console.error('Ошибка авторизации через API:', authError) + // Если авторизация не удалась, показываем Login Widget setShowLogin(true) setLoading(false) return } } - - // Верифицировать через API - const userData = await verifyAuth() - setUser(userData) - // Обработать параметр start из Telegram (для открытия конкретного поста) - if (tg?.startParam) { - // Если startParam начинается с "post_", это ссылка на пост - if (tg.startParam.startsWith('post_')) { - const postId = tg.startParam.replace('post_', '') - // Перенаправить на страницу с конкретным постом - window.location.href = `/feed?post=${postId}` - } - } + // Если нет initData, но есть WebApp API - это странно + // Показываем Login Widget + setShowLogin(true) + setLoading(false) } catch (err) { console.error('Ошибка инициализации:', err) setError(err.message) - } finally { setLoading(false) } } diff --git a/package.json b/package.json index e96b48a..d1210ab 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,8 @@ "helmet": "^7.1.0", "express-mongo-sanitize": "^2.2.0", "xss-clean": "^0.1.4", - "hpp": "^0.2.3" + "hpp": "^0.2.3", + "validator": "^13.11.0" }, "devDependencies": { "nodemon": "^3.0.1", diff --git a/🔧_ИСПРАВЛЕНИЯ_СЕРВЕРА.txt b/🔧_ИСПРАВЛЕНИЯ_СЕРВЕРА.txt index b17bf8d..4d6f834 100644 --- a/🔧_ИСПРАВЛЕНИЯ_СЕРВЕРА.txt +++ b/🔧_ИСПРАВЛЕНИЯ_СЕРВЕРА.txt @@ -16,8 +16,13 @@ ✅ 2. Исправлена логика авторизации в App.jsx • Проверка наличия window.Telegram?.WebApp перед проверкой пользователя - • Добавлена задержка на инициализацию Telegram Web App (200ms) - • Правильная обработка официального клиента Telegram + • Добавлена задержка на инициализацию Telegram Web App (300ms) + • Проверка наличия initData (строка) вместо initDataUnsafe.user + • Правильная обработка официального клиента Telegram - авторизация через API даже если user еще не распарсен + • Backend распарсит initData и создаст/найдет пользователя + +✅ 3. Добавлена зависимость validator в package.json + • validator: ^13.11.0 - для валидации и санитизации данных КОМАНДЫ ДЛЯ ОБНОВЛЕНИЯ НА СЕРВЕРЕ: @@ -36,13 +41,13 @@ cd /var/www/nakama git pull origin main # 5. Установить недостающие зависимости -npm install helmet express-mongo-sanitize xss-clean hpp --save +npm install helmet express-mongo-sanitize xss-clean hpp validator --save # Или установить все зависимости заново npm install --production # 6. Проверить что зависимости установлены -npm list helmet express-mongo-sanitize xss-clean hpp +npm list helmet express-mongo-sanitize xss-clean hpp validator # 7. Пересобрать frontend (с исправленной логикой авторизации) cd frontend @@ -69,7 +74,7 @@ pm2 logs nakama-backend --lines 50 БЫСТРАЯ КОМАНДА (одна строка): ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -ssh root@nakama.glpshchn.ru "cd /var/www/nakama && pm2 stop nakama-backend && npm install helmet express-mongo-sanitize xss-clean hpp --save && cd frontend && npm run build && cd .. && pm2 start backend/server.js --name nakama-backend --update-env && sleep 2 && pm2 status && pm2 logs nakama-backend --lines 30" +ssh root@nakama.glpshchn.ru "cd /var/www/nakama && pm2 stop nakama-backend && npm install helmet express-mongo-sanitize xss-clean hpp validator --save && cd frontend && npm run build && cd .. && pm2 start backend/server.js --name nakama-backend --update-env && sleep 2 && pm2 status && pm2 logs nakama-backend --lines 30" ПРОВЕРКА ПОСЛЕ ОБНОВЛЕНИЯ: @@ -107,8 +112,14 @@ sudo tail -f /var/log/nginx/error.log РЕШЕНИЕ: Добавлены зависимости в package.json ✅ Проблема 2: Даже с офф клиента Telegram просит авторизацию - РЕШЕНИЕ: Исправлена логика в App.jsx - теперь правильно проверяет - наличие Telegram Web App API и дает время на инициализацию + РЕШЕНИЕ: Исправлена логика в App.jsx - теперь проверяет наличие initData + (строка) вместо initDataUnsafe.user. Если есть initData, пытается + авторизоваться через API (backend распарсит initData). Это решает + проблему когда в официальном клиенте Telegram initDataUnsafe.user + еще не распарсен, но initData уже доступен. + +✅ Проблема 4: Error: Cannot find module 'validator' + РЕШЕНИЕ: Добавлена зависимость validator в package.json ✅ Проблема 3: 502 ошибка и постоянные ребуты РЕШЕНИЕ: После установки зависимостей приложение должно запускаться @@ -126,7 +137,7 @@ sudo tail -f /var/log/nginx/error.log 3. Проверить логи PM2 после перезапуска 4. Если все еще есть ошибки - проверить что все зависимости установлены: - npm list helmet express-mongo-sanitize xss-clean hpp + npm list helmet express-mongo-sanitize xss-clean hpp validator ГОТОВО! ✅