Update files
This commit is contained in:
parent
e3a363e3d9
commit
3d8eab6cdc
|
|
@ -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: 'Вы слишком активны, немного подождите',
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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))
|
// Проверить наличие initData (главный индикатор что мы в Telegram)
|
||||||
telegramUser = getTelegramUser()
|
const initData = tg.initData || ''
|
||||||
|
|
||||||
// Если все еще нет пользователя, показываем Login Widget
|
if (initData) {
|
||||||
if (!telegramUser) {
|
// Есть 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
|
|
||||||
const userData = await verifyAuth()
|
|
||||||
setUser(userData)
|
|
||||||
|
|
||||||
// Обработать параметр start из Telegram (для открытия конкретного поста)
|
// Если нет initData, но есть WebApp API - это странно
|
||||||
if (tg?.startParam) {
|
// Показываем Login Widget
|
||||||
// Если startParam начинается с "post_", это ссылка на пост
|
setShowLogin(true)
|
||||||
if (tg.startParam.startsWith('post_')) {
|
setLoading(false)
|
||||||
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
ГОТОВО! ✅
|
ГОТОВО! ✅
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue