2015-12-27 14 views
8

के साथ विशिष्ट सॉकेट से संदेश भेजने के लिए मैं सत्यापन के साथ कुछ सॉकेट है:कैसे फीनिक्स

defmodule Test.UserSocket do 
    use Phoenix.Socket 

    ## Channels 
    channel "user:*", Test.RoomChannel 

    def connect(_params, socket) do 
    case Phoenix.Token.verify(socket, "user", _params["token"]) do 
      {:ok, uid} -> 
      {:ok, assign(socket, :user_id, uid)} 
      {:error, _} -> 
      :error 
    end 
    end 

def id(_socket), do: "user:#{_socket.assigns.user_id}" 
end 

और प्रलेखन से की तरह user:#id

नामित कनेक्ट सॉकेट के बाद मैं डिस्कनेक्ट घटना भेज सकते हैं Test.Endpoint.broadcast("users_socket:" <> user.id, "disconnect", %{})

प्रश्न:user:#id द्वारा सॉकेट में कस्टम ईवेंट कैसे भेजें, यह विशिष्ट सॉकेट पर पुश अधिसूचना की तरह होना चाहिए।

मैंने Test.Endpoint.broadcast "user:1", "new:msg", %{user: "SYSTEM", body: "iex"} की कोशिश की लेकिन यह काम नहीं करता है, क्योंकि मैं सॉकेट पर "नया: msg" नहीं सुन सकता।

+0

यह काम करता है उदाहरण के लिए एक विशिष्ट चैनल देखने की अनुमति है की जाँच करने के userId का उपयोग: 1 ", {}) 'लेकिन इसमें' शामिल ' – user1156168

+4

में अतिरिक्त सत्यापन की आवश्यकता है, जैसा कि आपने वर्णित चैनल पर किया है। यदि आप कनेक्ट में सॉकेट पर वर्तमान उपयोगकर्ता को पहले से सत्यापित और असाइन कर चुके हैं तो आपको जुड़ने/3 में सत्यापित करने की आवश्यकता नहीं है। उपयोगकर्ता जो भी कमरा शामिल करने का प्रयास कर रहा है उसके खिलाफ बस socket.assigns.user_id की जांच करें। फिर आप उस कमरे 'एंडपॉइंट.बॉडकास्ट "पर प्रसारित करते हैं: कमरे" 1 "," new_msg ",% {उपयोगकर्ता:" सिस्टम ", बॉडी:" आईईएक्स "} –

+0

उत्तर के लिए धन्यवाद। तो हम केवल 'कमरे' अड्डों पर काम करते हैं। और मेरे स्रोत इस प्रकार होंगे: 'def में शामिल हों ("उपयोगकर्ता:" <> _uid, message, सॉकेट) अगर _uid == socket.assigns.user_id करें {: ठीक है, सॉकेट} अन्य {: त्रुटि,% { कारण: "अनधिकृत"}} अंत अंत ' – user1156168

उत्तर

2

क्रिस मैककॉर्ड के जवाब टिप्पणी से नीचे कॉपी करना:

आप एक चैनल पर यह करना है जैसे आप का वर्णन किया। यदि आप कनेक्ट में सॉकेट पर वर्तमान उपयोगकर्ता को पहले से सत्यापित और असाइन कर चुके हैं तो आपको join/3 में सत्यापित करने की आवश्यकता नहीं है। उपयोगकर्ता जो भी कमरा शामिल करने का प्रयास कर रहा है उसके खिलाफ बस socket.assigns.user_id देखें। तो फिर तुम उस कमरे के लिए प्रसारण Endpoint.broadcast "rooms:1", "new_msg", %{user: "SYSTEM", body: "iex"}

(समुदाय विकी के बाद से मैं प्रतिनिधि अंक नहीं चाहते हैं तो किसी को भी इस वोट दें करने का फैसला करता के रूप में जवाब अंकन। यह मेरा जवाब :) नहीं है)

0

जवाब के लिए धन्यवाद । तो हम केवल 'कमरे' अड्डों पर काम करते हैं। और मेरे स्रोत इस तरह होंगे: def join ("user:" <> _uid, message, सॉकेट) अगर _uid == socket.assigns.user_id करें {: ठीक है, सॉकेट} अन्य {: त्रुटि,% {कारण: "अनधिकृत"}} अंत अंत

आप के बाद से आप पहले से ही तर्क UserSocket में # कनेक्ट करता है, तो उपयोगकर्ता प्रमाणीकृत नहीं है वह संदेश है कि वह अधिकृत नहीं है हो जाता है परिभाषित किया है userId फिर से सत्यापित करने के लिए की जरूरत नहीं है, आप क्या कर सकते हैं जब मैं विशिष्ट कक्ष `वर चान = socket.channel (" उपयोगकर्ता में शामिल होने अगर उपयोगकर्ता

def join("rooms:some_private_room", message, socket) do 
    if socket.assigns.user_id do 
    {:ok, socket} 
    else 
    # kick him out he is not allowed here 
    {:error, %{reason: "unauthorized"}} 
    end 
end