2016-07-13 85 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-鳳凰框架) – PatNowak

回答

0

我認爲在這一點上最好的辦法是在連接時將這些值作爲參數發送。這可能意味着從Plug.Conn獲取信息並以某種方式將它傳遞給您的JS,或者以某種方式將其全部傳遞給您的JS。

無論如何,從這裏進入套接字,你會做這兩件事情之一。

上在套接字級別的JS側

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

在JS側在信道電平:

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 

如果您需要所有通道的信息,那麼在套接字級別執行此操作將很有意義。我非常肯定,無論哪種方式它都會在socket對象中結束,所以如果你使用多個通道的同一套接字,你會看到相同的分配。