Saya menggunakan kerangka ekspres. Saya ingin mencapai data sesi dari socket.io. Saya mencoba mengekspresikan dynamicHelpers dengan data client.listener.server.dynamicViewHelpers, tetapi saya tidak bisa mendapatkan data sesi. Apakah ada cara sederhana untuk melakukan hal ini? Silakan lihat kodenya
app.listen(3000);
var io = require('socket.io');
var io = io.listen(app);
io.on('connection', function(client){
// I want to use session data here
client.on('message', function(message){
// or here
});
client.on('disconnect', function(){
// or here
});
});
Jawaban:
Ini tidak akan berfungsi untuk soket yang melewati transportasi flashsocket (tidak mengirim server cookie yang diperlukan) tetapi berfungsi dengan andal untuk yang lainnya. Saya hanya menonaktifkan transportasi flashsocket dalam kode saya.
Untuk membuatnya berfungsi, di sisi express / connect, saya secara eksplisit mendefinisikan penyimpanan sesi sehingga saya dapat menggunakannya di dalam soket:
Kemudian di dalam kode soket saya, saya menyertakan kerangka kerja koneksi sehingga saya dapat menggunakan penguraian cookie untuk mengambil connect.sid dari cookie. Saya kemudian mencari sesi di penyimpanan sesi yang memiliki connect.sid itu seperti:
Anda kemudian dapat menggunakan sesi sesuai kebutuhan.
sumber
Solusi modul Socket.IO-session memaparkan aplikasi ke serangan XSS dengan mengekspos ID sesi di level klien (scripting).
Periksa solusi ini sebagai gantinya (untuk Socket.IO> = v0.7). Lihat dokumen di sini .
sumber
socket.io
adalah yang mengekspos ID sesi, bukan modul itu. Ini bukan masalah besar karena ID sesi disimpan di sisi klien dalam cookie ... Juga tutorial itu tidak berfungsi untuk versi Express terbaru.socket.io
halaman github ..?Saya menyarankan untuk tidak sepenuhnya menemukan kembali roda. Alat yang Anda butuhkan sudah merupakan paket npm. Saya pikir inilah yang Anda butuhkan: session.socket.io Saya menggunakannya di hari-hari ini dan itu akan sangat membantu saya kira !! Menghubungkan sesi ekspres ke lapisan socket.io akan memiliki banyak keuntungan!
sumber
Sunting: Setelah mencoba beberapa modul yang tidak berfungsi, saya benar-benar pergi dan menulis perpustakaan saya sendiri untuk melakukan ini. Steker yang tidak tahu malu: periksa di https://github.com/aviddiviner/Socket.IO-sessions . Saya akan meninggalkan posting lama saya di bawah ini untuk tujuan sejarah:
Saya mendapat pekerjaan ini cukup rapi tanpa harus bypass flashsocket transportasi sesuai pr0zac 's solusi di atas. Saya juga menggunakan express dengan Socket.IO. Begini caranya.
Pertama, teruskan ID sesi ke tampilan:
Kemudian dalam tampilan Anda, tautkan dengan sisi klien Socket.IO:
Kemudian di pendengar Socket.IO sisi server Anda, ambil dan baca / tulis data sesi:
Dalam kasus saya, saya
session_store
adalah Redis, menggunakanredis-connect
perpustakaan.Semoga ini membantu seseorang yang menemukan posting ini saat mencari Google (seperti yang saya lakukan;)
sumber
Lihat ini: Otentikasi Socket.IO
Saya menyarankan untuk tidak mengambil apa pun melalui
client.request...
atauclient.listener...
karena itu tidak langsung melekat padaclient
objek dan selalu mengarah ke pengguna yang terakhir masuk!sumber
Lihat Socket.IO-connect
Hubungkan WebSocket Middleware Wrapper Around Socket.IO-node https://github.com/bnoguchi/Socket.IO-connect
Ini akan memungkinkan Anda untuk mendorong permintaan Socket.IO ke tumpukan middleware Express / Connect sebelum menanganinya dengan event handler Socket.IO, memberi Anda akses ke sesi, cookie, dan banyak lagi. Meskipun, saya tidak yakin itu bekerja dengan semua transport Socket.IO.
sumber
Anda dapat menggunakan express-socket.io-session .
Bagikan middleware sesi ekspres berbasis cookie dengan socket.io. Bekerja dengan express> 4.0.0 dan socket.io> 1.0.0 dan tidak akan kompatibel ke belakang.
Bekerja untuk saya !!
sumber
Anda dapat melihat ini: https://github.com/bmeck/session-web-sockets
atau sebagai alternatif, Anda dapat menggunakan:
Semoga ini membantu.
sumber
Saya tidak yakin apakah saya melakukannya dengan benar. https://github.com/LearnBoost/socket.io/wiki/Authorizing
Dengan data jabat tangan, Anda dapat mengakses cookie. Dan di cookie, Anda dapat mengambil connect.sid yang merupakan id sesi untuk setiap klien. Dan kemudian gunakan connect.sid untuk mendapatkan data sesi dari database (Saya berasumsi Anda menggunakan RedisStore)
sumber