nakama/backend/middleware/botAuth.js

49 lines
1.9 KiB
JavaScript
Raw Normal View History

2025-12-08 23:42:32 +00:00
const config = require('../config');
const { logSecurityEvent } = require('./logger');
// Middleware для проверки что запрос идет от внутреннего бота
// Используется для ботов, которые работают внутри Docker сети
const authenticateBot = (req, res, next) => {
// Получить IP адрес клиента
const clientIp = req.ip || req.connection.remoteAddress || req.socket.remoteAddress;
const forwardedFor = req.headers['x-forwarded-for'];
const realIp = forwardedFor ? forwardedFor.split(',')[0].trim() : clientIp;
// Проверить внутренний токен бота (если установлен)
const botToken = req.headers['x-bot-token'];
const expectedBotToken = process.env.INTERNAL_BOT_TOKEN || config.internalBotToken;
// Проверить что запрос идет из внутренней сети Docker
const isInternalNetwork =
realIp === '127.0.0.1' ||
realIp === '::1' ||
realIp === '::ffff:127.0.0.1' ||
realIp.startsWith('172.') || // Docker network range
realIp.startsWith('192.168.') ||
realIp.startsWith('10.');
// Если установлен токен - проверить его
if (expectedBotToken) {
if (botToken === expectedBotToken) {
req.isBot = true;
return next();
}
logSecurityEvent('INVALID_BOT_TOKEN', req, { ip: realIp });
return res.status(403).json({ error: 'Неверный токен бота' });
}
// Если токена нет - разрешить только из внутренней сети
if (isInternalNetwork || !config.isProduction()) {
req.isBot = true;
return next();
}
logSecurityEvent('EXTERNAL_BOT_ACCESS_ATTEMPT', req, { ip: realIp });
return res.status(403).json({ error: 'Доступ только из внутренней сети' });
};
module.exports = {
authenticateBot
};