nakama/backend/middleware/botAuth.js

49 lines
1.9 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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