如何在phoenix-framework中从socket获取remote_ip?

时间:2015-10-22 08:10:24

标签: sockets ip elixir phoenix-framework

如何从phoenixframework中的socket获取remote_ip?我可以从视图中的conn获取它,但不能在Channel中获取它。

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

现在的答案是:你不能。您无法在渠道中访问连接,因为渠道与传输无关。在凤凰城开设一个问题,详细说明您的用户案例,以便凤凰队可以采取行动。

答案 1 :(得分:0)

此处提供的答案的副本:https://elixirforum.com/t/phoenix-socket-channels-security-ip-identification/1463/3(所有功劳归于https://elixirforum.com/u/arjan

凤凰城1.4更新:

从Phoenix 1.4开始,您可以从基础传输中获取连接信息。您获得哪种信息取决于传输,但是通过WebSocket传输,可以检索对等信息(IP地址)和x-头列表(用于x-forwarded-用于解析)。

在endpoint.ex中像这样配置套接字:

socket("/socket", MyApp.Web.UserSocket,
  websocket: [connect_info: [:peer_data, :x_headers]],
  longpoll: [connect_info: [:peer_data, :x_headers]]
)

然后您的UserSocket模块必须公开如下的connect / 3函数:

def connect(_params, socket, connect_info) do
  {:ok, socket}
end

在连接时,connect_info参数现在包含来自传输的信息:

info: %{
  peer_data: %{address: {127, 0, 0, 1}, port: 52372, ssl_cert: nil},
  x_headers: []
}