Как получить IP-адрес пользователя на сервере Meteor?
Я хотел бы получить IP-адрес пользователя в своем приложении meteor на стороне сервера, чтобы я мог регистрировать IP-адрес с помощью множества вещей (например, незарегистрированные пользователи, подписавшиеся на список рассылки, или просто делая что-то важное).
Я знаю, что IP-адрес, видимый сервером, может отличаться от реального адреса источника при наличии обратных прокси. В таких ситуациях заголовок X-Forwarded-For
должен анализироваться для получения реального общедоступного IP-адреса пользователя. Обратите внимание, что разбор X-Forwarded-For
не должен быть автоматическим (см. http://www.openinfo.co.uk/apache/index.html для обсуждения возможных проблем безопасности).
Внешняя ссылка: этот вопрос появился в списке рассылки метеоритов в августе 2012 года (не предлагалось решение).
Ответы
Ответ 1
1 - без http-запроса в функциях вы сможете получить clientIP с помощью
clientIP = this.connection.clientAddress;
//EX: you declare a submitForm function with Meteor.methods and
//you call it from the client with Meteor.call().
//In submitForm function you will have access to the client address as above
2 - с помощью HTTP-запроса и использования функции iron-router и его функции Router.map:
В функции действия целевого маршрута используйте:
clientIp = this.request.connection.remoteAddress;
3 - использование функции Meteor.onConnection:
Meteor.onConnection(function(conn) {
console.log(conn.clientAddress);
});
Ответ 2
Как и в ответе TimDog, но работает с более новыми версиями Meteor:
var Fiber = Npm.require('fibers');
__meteor_bootstrap__.app
.use(function(req, res, next) {
Fiber(function () {
console.info(req.connection.remoteAddress);
next();
}).run();
});
Это должно быть в коде сервера верхнего уровня (не в Meteor.startup)
Ответ 3
Этот ответ fooobar.com/questions/209253/... уже неплохо показывает, как получить IP-адрес клиента.
Я просто хочу отметить, что , если ваше приложение обслуживается за прокси-серверами (обычно это происходит), вам нужно установить переменную среды HTTP_FORWARDED_COUNT
на номер используемых вами прокси.
Ссылка: https://docs.meteor.com/api/connections.html#Meteor-onConnection
Ответ 4
Вы можете сделать это в своем серверном коде:
Meteor.userIPMap = [];
__meteor_bootstrap__.app.on("request", function(req, res) {
var uid = Meteor.userId();
if (!uid) uid = "anonymous";
if (!_.any(Meteor.userIPMap, function(m) { m.userid === uid; })) {
Meteor.userIPMap.push({userid: uid, ip: req.connection.remoteAddress });
}
});
Затем вы получите Meteor.userIPMap с картой userid для ip-адресов (для размещения заголовка x-forwarded-for, использовать эту функцию внутри выше).
Три примечания: (1) это будет срабатывать всякий раз, когда в вашем приложении есть запрос, поэтому я не уверен, какая именно производительность приведет к этому; (2) объект __meteor_bootstrap__
уходит в ближайшее время, я думаю, с предстоящей обновленной системой пакетов; и (3) пользователю anonymous
нужна более эффективная обработка здесь. Вам понадобится способ подключения анонимного пользователя к IP уникальным постоянным ограничением в объекте запроса.
Ответ 5
Вам нужно подключиться к сеансам сервера и захватить ip текущего пользователя:
Meteor.userIP = function(uid) {
var k, ret, s, ss, _ref, _ref1, _ref2, _ref3;
ret = {};
if (uid != null) {
_ref = Meteor.default_server.sessions;
for (k in _ref) {
ss = _ref[k];
if (ss.userId === uid) {
s = ss;
}
}
if (s) {
ret.forwardedFor = ( _ref1 = s.socket) != null ?
( _ref2 = _ref1.headers) != null ?
_ref2['x-forwarded-for'] : void 0 : void 0;
ret.remoteAddress = ( _ref3 = s.socket) != null ?
_ref3.remoteAddress : void 0;
}
}
return ret.forwardedFor ? ret.forwardedFor : ret.remoteAddress;
};
Конечно, вам понадобится текущий пользователь для входа в систему. Если вам это нужно для анонимных пользователей, следуйте этот пост, я написал.
P.S. Я знаю, что это старый поток, но ему не хватает полного ответа или кода, который больше не работает.
Ответ 6
Вот способ, который работал у меня, чтобы получить IP-адрес клиента из любого места на сервере, без использования дополнительных пакетов. Работа в Meteor 0.7 и должна работать и в более ранних версиях.
На клиенте получите URL-адрес сокета (уникальный) и отправьте его на сервер. Вы можете просмотреть URL-адрес сокета в веб-консоли (в разделе "Сеть в Chrome и Safari" ).
socket_url = Meteor.default_connection._stream.socket._transport.url
Meteor.call('clientIP', socket_url)
Затем на сервере используйте URL-адрес клиентского сокета, чтобы найти свой IP-адрес в Meteor.server.sessions
.
sr = socket_url.split('/')
socket_path = "/"+sr[sr.length-4]+"/"+sr[sr.length-3]+"/"+sr[sr.length-2]+"/"+sr[sr.length-1]
_.each(_.values(Meteor.server.sessions), (session) ->
if session.socket.url == socket_path
user_ip = session.socket.remoteAddress
)
user_ip
теперь содержит IP-адрес подключенного клиента.