2016-07-13 6 views
5

チャンネルには、クライアントのIPアドレスとホスト名が必要です。phoenixのwebsocketトランスポートからクライアントデータ(IP、ホスト名)を取得する方法は?

私はペイロードとして署名を送ることができますが、エンドポイントがクロスドメインホストやモバイルアプリから利用可能である必要がある場合は、この情報に署名することはできません。

私は、Phoenix.Transport.WebSocketに基づいて独自のトランスポートを作成し、関連する情報をソケットに注入するオプションがありますが、その方法はわかりません。

+0

[phoenix-frameworkのソケットからリモート\ _ipを取得する方法は?](http://stackoverflow.com/questions/33276202/how-to-get-remote-ip-from-socket-in- phoenix-framework) – PatNowak

答えて

0

私はこの時点で、接続するときに、これらの値をパラメータとして送信することをお勧めします。それはおそらく、Plug.Connから情報を取得して何とかJSに渡すことを意味するか、何らかの理由ですべてのクライアント側でそれを行うことを意味します。

とにかくそこからソケットに入れるには、この2つのうちのどちらかを実行します。ソケットレベルでのJS側の

:チャネルレベルでのJS側の

var socket = new Socket("/socket", {ip: "127.0.0.1", host: "localhost"}) 

:あなたのソケットモジュールで

var channel = socket.channel("topic:subtopic", {ip: "127.0.0.1", host: "localhost"}) 

def connect(_params = %{"ip" => ip, "host" => host}, socket) do 
    socket = 
    socket 
    |> assign(:ip, ip) 
    |> assign(:host, host) 

    {:ok, socket} 
end 

やであなたのチャンネルモジュール:

def join("topic:subtopic", _params = %{ip: ip, host: host}, socket) do 
    socket = 
    socket 
    |> assign(:ip, ip) 
    |> assign(:host, host) 

    {:noreply, socket} 
end 

すべてのチャンネルの情報が必要な場合は、ソケットレベルで行うのが理にかなっています。私はかなりソケットのオブジェクトで終わるどちらかの方法を確信しているので、複数のチャネルのために同じソケットを使用している場合は、同じ割り当てを参照してください。

関連する問題