Подтвердить что ты не робот

Как получить IP-адрес пользователя на сервере Meteor?

Я хотел бы получить IP-адрес пользователя в своем приложении meteor на стороне сервера, чтобы я мог регистрировать IP-адрес с помощью множества вещей (например, незарегистрированные пользователи, подписавшиеся на список рассылки, или просто делая что-то важное).

Я знаю, что IP-адрес, видимый сервером, может отличаться от реального адреса источника при наличии обратных прокси. В таких ситуациях заголовок X-Forwarded-For должен анализироваться для получения реального общедоступного IP-адреса пользователя. Обратите внимание, что разбор X-Forwarded-For не должен быть автоматическим (см. http://www.openinfo.co.uk/apache/index.html для обсуждения возможных проблем безопасности).

Внешняя ссылка: этот вопрос появился в списке рассылки метеоритов в августе 2012 года (не предлагалось решение).

4b9b3361

Ответ 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-адрес подключенного клиента.