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