2016-07-13 52 views
5

Nel canale, ho bisogno dell'indirizzo IP del client e del nome host.Come ottenere i dati client (IP, nome host) dal trasporto websocket in phoenix?

So che può essere inviato firmato come payload, ma se l'endpoint deve essere disponibile da host di dominio incrociato, o anche app mobili, quindi non posso passare questa informazione firmata.

Ho letto che un'opzione è creare il mio trasporto basato su Phoenix.Transport.WebSocket, iniettando le informazioni rilevanti nel socket, ma non so come farlo.

+0

Possibile duplicato di [come ottenere remote \ _ip dal socket in phoenix-framework?] (Http://stackoverflow.com/questions/33276202/how-to-get-remote-ip-from-socket-in- phoenix-quadro) – PatNowak

risposta

0

Penso che a questo punto il modo migliore sarebbe quello di inviare quei valori come parametri durante la connessione. Ciò significherebbe probabilmente ottenere le informazioni dallo Plug.Conn e passarlo in qualche modo al tuo JS, o in qualche modo farlo tutto lato client.

In ogni caso, per metterlo nella presa da lì, faresti una di queste due cose.

sul lato JS a livello di socket:

var socket = new Socket("/socket", {ip: "127.0.0.1", host: "localhost"}) 

sul lato JS a livello del canale:

var channel = socket.channel("topic:subtopic", {ip: "127.0.0.1", host: "localhost"}) 

nel modulo zoccolo:

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

    {:ok, socket} 
end 

o il tuo modulo di canale:

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

    {:noreply, socket} 
end 

Se avessi bisogno di queste informazioni per tutti i tuoi canali, avrebbe senso farlo a livello di socket. Sono abbastanza sicuro che in ogni caso finisca nell'oggetto socket, quindi se stai usando lo stesso socket per più canali, vedresti gli stessi assegnamenti.