如何从凤凰城的websocket传输中获取客户端数据(IP,主机名)?

时间:2016-07-13 09:28:45

标签: elixir phoenix-framework

在频道中,我需要客户端的IP地址和主机名。

我知道它可以作为有效负载发送签名,但如果端点应该可以从跨域主机,甚至是移动应用程序中获得,那么我就无法通过这些信息签名。

我读过一个选项是基于Phoenix.Transport.WebSocket创建我自己的传输,将相关信息注入套接字,但我不知道该怎么做。

1 个答案:

答案 0 :(得分:0)

我认为在这一点上,最好的方法是在连接时将这些值作为参数发送。这可能意味着从Plug.Conn获取信息并以某种方式将其传递给您的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

如果您需要所有频道的信息,那么在套接字级别进行此操作是有意义的。我非常确定它最终会在套接字对象中结束,所以如果你为多个频道使用相同的套接字,你就会看到相同的分配。