27

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

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

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

4

6 に答える 6

34

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);
});
于 2014-03-26T10:02:35.123 に答える
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 ではありません)。

于 2013-06-13T03:07:03.240 に答える
1

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

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 にアタッチする方法が必要になります。

于 2013-02-13T01:02:22.733 に答える
1

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

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

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

于 2014-03-03T18:50:16.723 に答える