web-dev-qa-db-ja.com

MeteorサーバーでユーザーIPアドレスを取得するにはどうすればよいですか?

サーバー側のmeteorアプリケーションでユーザーIPアドレスを取得して、IPアドレスをさまざまなもの(たとえば、未登録のユーザーがメーリングリストに登録している、または単に何かをしている)でログに記録できるようにしたいと思います。 重要)。

リバースプロキシが関係している場合、サーバーによって「認識される」IPアドレスが実際の送信元アドレスと異なる可能性があることを私は知っています。このような状況では、X-Forwarded-Forヘッダーを解析して、ユーザーの実際のパブリックIPアドレスを取得する必要があります。 X-Forwarded-Forの解析は自動ではないことに注意してください(潜在的なセキュリティ問題の説明については、 http://www.openinfo.co.uk/Apache/index.html を参照してください)。

外部参照:この質問は 2012年8月のmeteor-talkメーリングリスト (解決策は提供されていません)に出てきました。

26
sarfata

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;

-Meteor.onConnection関数を使用:

Meteor.onConnection(function(conn) {
    console.log(conn.clientAddress);
});
30
Florin Dobre

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ではなく)トップレベルのサーバーコードに含まれている必要があります

2
prideout

この答え https://stackoverflow.com/a/22657421/2845061 は、クライアントのIPアドレスを取得する方法を示す上ですでに良い仕事をしています。

アプリがプロキシサーバーの背後で提供されている場合(通常は発生します)HTTP_FORWARDED_COUNT環境変数を次の数に設定する必要があることに注意してください。使用しているプロキシ。

参照: https://docs.meteor.com/api/connections.html#Meteor-onConnection

2
kkkkkkk

サーバーセッションにフックして、現在のユーザーの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.私はそれが古いスレッドであることを知っていますが、それは完全な答えを欠いているか、もはや機能しないコードを持っていました。

1
Romeo Mihalcea

これは、追加のパッケージを使用せずに、サーバー上のどこからでもクライアントのIPアドレスを取得するために私が働いた方法です。 Meteor 0.7で動作し、以前のバージョンでも動作するはずです。

クライアントで、ソケットURL(一意)を取得してサーバーに送信します。 WebコンソールでソケットURLを表示できます(ChromeおよびSafariのネットワークの下)。

socket_url = Meteor.default_connection._stream.socket._transport.url
Meteor.call('clientIP', socket_url)

次に、サーバー上で、クライアントのソケットURLを使用してMeteor.server.sessionsでIPを検索します。

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アドレスが含まれるようになりました。

1
alste

サーバーコードでこれを行うことができます:

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

次に、ユーザーIDからIPアドレスへのマップを含むMeteor.userIPMapが作成されます(x-forwarded-forヘッダーに対応するために、 この関数を使用 上記の内部にあります)。

3つの注意事項:(1)これはアプリにリクエストがあるたびに発生するため、これがどのようなパフォーマンスヒットを引き起こすかはわかりません。 (2)__meteor_bootstrap__オブジェクトは間もなくなくなります。今後の改良されたパッケージシステムで、私は思います。 (3)anonymousユーザーは、ここでより適切に処理する必要があります。リクエストオブジェクトの一意の永続的な制約によって、匿名ユーザーをIPにアタッチする方法が必要になります。

1
TimDog