Gunakan connect-redis dan miliki redis sebagai penyimpanan sesi Anda untuk semua pengguna yang diautentikasi. Pastikan pada otentikasi Anda mengirim kunci (biasanya req.sessionID) ke klien. Minta klien menyimpan kunci ini dalam cookie.
Pada soket terhubung (atau kapan saja nanti) ambil kunci ini dari cookie dan kirimkan kembali ke server. Ambil informasi sesi di redis menggunakan kunci ini. (GET key)
Misalnya:
Sisi server (dengan redis sebagai penyimpanan sesi):
req.session.regenerate...
res.send({rediskey: req.sessionID});
Sisi klien:
//store the key in a cookie
SetCookie('rediskey', <%= rediskey %>); //http://msdn.microsoft.com/en-us/library/ms533693(v=vs.85).aspx
//then when socket is connected, fetch the rediskey from the document.cookie and send it back to server
var socket = new io.Socket();
socket.on('connect', function() {
var rediskey = GetCookie('rediskey'); //http://msdn.microsoft.com/en-us/library/ms533693(v=vs.85).aspx
socket.send({rediskey: rediskey});
});
Sisi server:
//in io.on('connection')
io.on('connection', function(client) {
client.on('message', function(message) {
if(message.rediskey) {
//fetch session info from redis
redisclient.get(message.rediskey, function(e, c) {
client.user_logged_in = c.username;
});
}
});
});
GetCookie
adalah fungsi javascript.Saya juga menyukai cara pusherapp melakukan saluran pribadi .
Karena juga
socket.io
memiliki socket_id unik untuk setiap soket.Mereka menggunakan string otorisasi yang ditandatangani untuk memberi otorisasi kepada pengguna.
Saya belum mencerminkan ini
socket.io
, tapi saya pikir ini bisa menjadi konsep yang cukup menarik.sumber
Saya tahu ini agak lama, tetapi untuk pembaca di masa mendatang selain pendekatan parsing cookie dan mengambil sesi dari penyimpanan (misalnya passport.socketio ) Anda juga dapat mempertimbangkan pendekatan berbasis token.
Dalam contoh ini saya menggunakan Token Web JSON yang cukup standar. Anda harus memberikan token kepada halaman klien, dalam contoh ini bayangkan titik akhir otentikasi yang mengembalikan JWT:
Sekarang, server socket.io Anda dapat dikonfigurasi sebagai berikut:
Middleware socket.io-jwt mengharapkan token dalam string kueri, jadi dari klien Anda hanya perlu melampirkannya saat menghubungkan:
Saya menulis penjelasan yang lebih rinci tentang metode dan cookie ini di sini .
sumber
Inilah upaya saya agar yang berikut ini berfungsi:
Karena Anda mungkin ingin menambahkan beberapa permintaan API juga, kami juga akan menggunakan paket http agar HTTP dan soket Web bekerja di port yang sama.
server.js
Ekstrak berikut hanya mencakup semua yang Anda butuhkan untuk mengatur teknologi sebelumnya. Anda dapat melihat versi server.js lengkap yang saya gunakan di salah satu proyek saya di sini .
sockets / index.js
Kami
socketConnectionHandler
, saya hanya tidak suka meletakkan semuanya di dalam server.js (meskipun Anda bisa), terutama karena file ini dapat berisi cukup banyak kode dengan cukup cepat.Materi tambahan (klien):
Hanya versi yang sangat dasar dari apa yang bisa menjadi klien JavaScript socket.io:
Referensi:
Saya hanya tidak bisa merujuk ke dalam kode, jadi saya memindahkannya ke sini.
1: Cara mengatur strategi Paspor Anda: https://scotch.io/tutorials/easy-node-authentication-setup-and-local#handling-signupregistration
sumber
Artikel ini ( http://simplapi.wordpress.com/2012/04/13/php-and-node-js-session-share-redi/ ) menunjukkan cara
Dengan menggunakan kode ini, Anda juga bisa mendapatkannya di socket.io.
sumber
gunakan sesi dan redis antara c / s
// sisi server
sumber
ini harus melakukannya
sumber