如何从phoenixframework中的socket获取remote_ip?我可以从视图中的conn获取它,但不能在Channel中获取它。
非常感谢您的帮助!
答案 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: []
}