5
在通道中,我需要客戶端的IP地址和主機名。如何從phoenix中的websocket傳輸獲取客戶端數據(IP,主機名)?
我知道它可以作爲有效載荷發送簽名,但是如果端點應該可以從跨域主機甚至移動應用程序中使用,所以我無法傳遞此簽名信息。
我讀過一個選項是基於Phoenix.Transport.WebSocket創建自己的傳輸,將相關信息注入套接字,但我不知道該怎麼做。
在通道中,我需要客戶端的IP地址和主機名。如何從phoenix中的websocket傳輸獲取客戶端數據(IP,主機名)?
我知道它可以作爲有效載荷發送簽名,但是如果端點應該可以從跨域主機甚至移動應用程序中使用,所以我無法傳遞此簽名信息。
我讀過一個選項是基於Phoenix.Transport.WebSocket創建自己的傳輸,將相關信息注入套接字,但我不知道該怎麼做。
我認爲在這一點上最好的辦法是在連接時將這些值作爲參數發送。這可能意味着從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對象中結束,所以如果你使用多個通道的同一套接字,你會看到相同的分配。
[如何從phoenix-framework中的套接字獲得遠程\ _ip?](http://stackoverflow.com/questions/33276202/how-to-get-remote-ip-from-socket-in-鳳凰框架) – PatNowak