Update files

This commit is contained in:
glpshchn 2025-11-05 01:23:33 +03:00
parent e3a363e3d9
commit 3d8eab6cdc
5 changed files with 59 additions and 44 deletions

View File

@ -2,7 +2,7 @@ const rateLimit = require('express-rate-limit');
// Общий лимит для API // Общий лимит для API
const generalLimiter = rateLimit({ const generalLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 минут windowMs: 15 * 1000, // 15 секунд
max: 100, // 100 запросов max: 100, // 100 запросов
message: 'Слишком много запросов, попробуйте позже', message: 'Слишком много запросов, попробуйте позже',
standardHeaders: true, standardHeaders: true,
@ -11,29 +11,29 @@ const generalLimiter = rateLimit({
// Строгий лимит для создания постов // Строгий лимит для создания постов
const postCreationLimiter = rateLimit({ const postCreationLimiter = rateLimit({
windowMs: 60 * 60 * 1000, // 1 час windowMs: 15 * 1000, // 15 секунд
max: 10, // 10 постов в час max: 10, // 10 постов
message: 'Вы создаёте слишком много постов, подождите немного', message: 'Вы создаёте слишком много постов, подождите немного',
skipSuccessfulRequests: true, skipSuccessfulRequests: true,
}); });
// Лимит для авторизации // Лимит для авторизации
const authLimiter = rateLimit({ const authLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 минут windowMs: 15 * 1000, // 15 секунд
max: 5, // 5 попыток max: 5, // 5 попыток
message: 'Слишком много попыток авторизации', message: 'Слишком много попыток авторизации',
}); });
// Лимит для поиска // Лимит для поиска
const searchLimiter = rateLimit({ const searchLimiter = rateLimit({
windowMs: 60 * 1000, // 1 минута windowMs: 15 * 1000, // 15 секунд
max: 30, // 30 запросов max: 30, // 30 запросов
message: 'Слишком много поисковых запросов', message: 'Слишком много поисковых запросов',
}); });
// Лимит для лайков/комментариев (защита от спама) // Лимит для лайков/комментариев (защита от спама)
const interactionLimiter = rateLimit({ const interactionLimiter = rateLimit({
windowMs: 60 * 1000, // 1 минута windowMs: 15 * 1000, // 15 секунд
max: 20, // 20 действий max: 20, // 20 действий
message: 'Вы слишком активны, немного подождите', message: 'Вы слишком активны, немного подождите',
}); });

View File

@ -47,7 +47,7 @@ const hppProtection = hpp();
// Строгий rate limit для авторизации // Строгий rate limit для авторизации
const strictAuthLimiter = rateLimit({ const strictAuthLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 минут windowMs: 15 * 1000, // 15 секунд
max: 5, // 5 попыток max: 5, // 5 попыток
message: 'Слишком много попыток авторизации, попробуйте позже', message: 'Слишком много попыток авторизации, попробуйте позже',
standardHeaders: true, standardHeaders: true,
@ -57,7 +57,7 @@ const strictAuthLimiter = rateLimit({
// Rate limit для создания постов (защита от спама) // Rate limit для создания постов (защита от спама)
const strictPostLimiter = rateLimit({ const strictPostLimiter = rateLimit({
windowMs: 60 * 60 * 1000, // 1 час windowMs: 15 * 1000, // 15 секунд
max: 10, // 10 постов max: 10, // 10 постов
message: 'Превышен лимит создания постов, попробуйте позже', message: 'Превышен лимит создания постов, попробуйте позже',
standardHeaders: true, standardHeaders: true,
@ -67,7 +67,7 @@ const strictPostLimiter = rateLimit({
// Rate limit для файлов // Rate limit для файлов
const fileUploadLimiter = rateLimit({ const fileUploadLimiter = rateLimit({
windowMs: 60 * 60 * 1000, // 1 час windowMs: 15 * 1000, // 15 секунд
max: 50, // 50 загрузок max: 50, // 50 загрузок
message: 'Превышен лимит загрузки файлов', message: 'Превышен лимит загрузки файлов',
standardHeaders: true, standardHeaders: true,
@ -76,8 +76,8 @@ const fileUploadLimiter = rateLimit({
// DDoS защита - агрессивный rate limit // DDoS защита - агрессивный rate limit
const ddosProtection = rateLimit({ const ddosProtection = rateLimit({
windowMs: 60 * 1000, // 1 минута windowMs: 15 * 1000, // 15 секунд
max: 100, // 100 запросов в минуту max: 100, // 100 запросов
message: 'Слишком много запросов, попробуйте позже', message: 'Слишком много запросов, попробуйте позже',
standardHeaders: true, standardHeaders: true,
legacyHeaders: false, legacyHeaders: false,

View File

@ -41,40 +41,43 @@ function App() {
return return
} }
// Получить данные пользователя из Telegram // В официальном клиенте Telegram есть initData (даже если user еще не распарсен)
let telegramUser = getTelegramUser() // Пробуем авторизоваться через API - backend распарсит initData
// Если нет пользователя в initData, но есть WebApp API - дать время на инициализацию // Дать время на полную инициализацию Telegram Web App
if (!telegramUser) { await new Promise(resolve => setTimeout(resolve, 300))
// Дать немного времени на инициализацию (Telegram Web App может загружаться асинхронно)
await new Promise(resolve => setTimeout(resolve, 200))
telegramUser = getTelegramUser()
// Если все еще нет пользователя, показываем Login Widget // Проверить наличие initData (главный индикатор что мы в Telegram)
if (!telegramUser) { 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) setShowLogin(true)
setLoading(false) setLoading(false)
return return
} }
} }
// Верифицировать через API // Если нет initData, но есть WebApp API - это странно
const userData = await verifyAuth() // Показываем Login Widget
setUser(userData) setShowLogin(true)
setLoading(false)
// Обработать параметр start из Telegram (для открытия конкретного поста)
if (tg?.startParam) {
// Если startParam начинается с "post_", это ссылка на пост
if (tg.startParam.startsWith('post_')) {
const postId = tg.startParam.replace('post_', '')
// Перенаправить на страницу с конкретным постом
window.location.href = `/feed?post=${postId}`
}
}
} catch (err) { } catch (err) {
console.error('Ошибка инициализации:', err) console.error('Ошибка инициализации:', err)
setError(err.message) setError(err.message)
} finally {
setLoading(false) setLoading(false)
} }
} }

View File

@ -32,7 +32,8 @@
"helmet": "^7.1.0", "helmet": "^7.1.0",
"express-mongo-sanitize": "^2.2.0", "express-mongo-sanitize": "^2.2.0",
"xss-clean": "^0.1.4", "xss-clean": "^0.1.4",
"hpp": "^0.2.3" "hpp": "^0.2.3",
"validator": "^13.11.0"
}, },
"devDependencies": { "devDependencies": {
"nodemon": "^3.0.1", "nodemon": "^3.0.1",

View File

@ -16,8 +16,13 @@
✅ 2. Исправлена логика авторизации в App.jsx ✅ 2. Исправлена логика авторизации в App.jsx
• Проверка наличия window.Telegram?.WebApp перед проверкой пользователя • Проверка наличия window.Telegram?.WebApp перед проверкой пользователя
• Добавлена задержка на инициализацию Telegram Web App (200ms) • Добавлена задержка на инициализацию Telegram Web App (300ms)
• Правильная обработка официального клиента Telegram • Проверка наличия 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 git pull origin main
# 5. Установить недостающие зависимости # 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 npm install --production
# 6. Проверить что зависимости установлены # 6. Проверить что зависимости установлены
npm list helmet express-mongo-sanitize xss-clean hpp npm list helmet express-mongo-sanitize xss-clean hpp validator
# 7. Пересобрать frontend (с исправленной логикой авторизации) # 7. Пересобрать frontend (с исправленной логикой авторизации)
cd 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 РЕШЕНИЕ: Добавлены зависимости в package.json
✅ Проблема 2: Даже с офф клиента Telegram просит авторизацию ✅ Проблема 2: Даже с офф клиента Telegram просит авторизацию
РЕШЕНИЕ: Исправлена логика в App.jsx - теперь правильно проверяет РЕШЕНИЕ: Исправлена логика в App.jsx - теперь проверяет наличие initData
наличие Telegram Web App API и дает время на инициализацию (строка) вместо initDataUnsafe.user. Если есть initData, пытается
авторизоваться через API (backend распарсит initData). Это решает
проблему когда в официальном клиенте Telegram initDataUnsafe.user
еще не распарсен, но initData уже доступен.
✅ Проблема 4: Error: Cannot find module 'validator'
РЕШЕНИЕ: Добавлена зависимость validator в package.json
✅ Проблема 3: 502 ошибка и постоянные ребуты ✅ Проблема 3: 502 ошибка и постоянные ребуты
РЕШЕНИЕ: После установки зависимостей приложение должно запускаться РЕШЕНИЕ: После установки зависимостей приложение должно запускаться
@ -126,7 +137,7 @@ sudo tail -f /var/log/nginx/error.log
3. Проверить логи PM2 после перезапуска 3. Проверить логи PM2 после перезапуска
4. Если все еще есть ошибки - проверить что все зависимости установлены: 4. Если все еще есть ошибки - проверить что все зависимости установлены:
npm list helmet express-mongo-sanitize xss-clean hpp npm list helmet express-mongo-sanitize xss-clean hpp validator
ГОТОВО! ✅ ГОТОВО! ✅