49 lines
1.9 KiB
JavaScript
49 lines
1.9 KiB
JavaScript
|
|
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
|
|||
|
|
};
|
|||
|
|
|