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

Adr*_*bao 5 elixir phoenix-framework

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

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

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

Eri*_*rik 1

我认为此时最好的方法是在连接时将这些值作为参数发送。这可能意味着从 获取信息并Plug.Conn以某种方式将其传递给你的 JS,或者以某种方式在客户端完成所有操作。

无论如何,要将其从那里插入插座,您可以执行以下两件事之一。

在 JS 端的套接字级别:

var socket = new Socket("/socket", {ip: "127.0.0.1", host: "localhost"})
Run Code Online (Sandbox Code Playgroud)

在通道级别的 JS 端:

var channel = socket.channel("topic:subtopic", {ip: "127.0.0.1", host: "localhost"})
Run Code Online (Sandbox Code Playgroud)

在你的套接字模块中:

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

  {:ok, socket}
end
Run Code Online (Sandbox Code Playgroud)

或在您的频道模块中:

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

  {:noreply, socket}
end
Run Code Online (Sandbox Code Playgroud)

如果您的所有通道都需要该信息,那么在套接字级别执行此操作是有意义的。我很确定无论哪种方式它最终都会出现在套接字对象中,因此如果您对多个通道使用相同的套接字,您会看到相同的分配。