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
|
||
};
|
||
|