Domanda

Sto usando framework espresso. Voglio raggiungere i dati della sessione da socket.io. Ho provato dynamicHelpers Express con i dati client.listener.server.dynamicViewHelpers, ma non riesco a ottenere i dati di sessione. C'è un modo semplice per fare questo? Si prega di vedere il codice

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
    }); 
});
È stato utile?

Soluzione

Questo non funziona per i socket andando oltre il trasporto flashsocket (non invia al server i cookie necessario), ma funziona in modo affidabile per tutto il resto. Mi basta disabilitare il trasporto flashsocket nel mio codice.

Per farlo funzionare, nella / lato del collegamento espresso, mi definisco in modo esplicito il negozio di sessione in modo da poter utilizzare all'interno presa:

MemoryStore = require('connect/middleware/session/memory'),
var session_store = new MemoryStore();
app.configure(function () {
  app.use(express.session({ store: session_store }));
});

Poi dentro il mio codice di presa, ho includono il quadro di connessione in modo da poter usare la sua analisi dei cookie per recuperare il connect.sid dai cookie. Ho poi guardo la sessione nel negozio sessione che ha quel connect.sid in questo modo:

var connect = require('connect');
io.on('connection', function(socket_client) {
  var cookie_string = socket_client.request.headers.cookie;
  var parsed_cookies = connect.utils.parseCookie(cookie_string);
  var connect_sid = parsed_cookies['connect.sid'];
  if (connect_sid) {
    session_store.get(connect_sid, function (error, session) {
      //HOORAY NOW YOU'VE GOT THE SESSION OBJECT!!!!
    });
  }
});

È quindi possibile utilizzare la sessione, se necessario.

Altri suggerimenti

La soluzione modulo Socket.IO sedute espone l'applicazione per attacchi XSS esponendo l'ID di sessione a livello (scripting) client.

Seleziona questa soluzione invece (per Socket.IO> = v0.7). Vedere documentazione qui .

suggerisco di non reinventare la ruota del tutto. Gli strumenti necessari è già un NPM package.I che questo è quello che vi serve: session.socket.io Io lo utilizzo in questi giorni e sarà molto utile immagino !! Collegando l'espresso sessione allo strato socket.io avrà così tanti vantaggi!

Modifica Dopo aver provato alcuni moduli che non ha funzionato, in realtà ho scritto andato e la mia libreria per fare questo. spudorato: andare controllo fuori a https://github.com/aviddiviner/Socket.IO-sessions . Lascio il mio vecchio post qui sotto per scopi storici:


ho ottenuto questo lavoro abbastanza ordinatamente, senza dover bypassare il flashsocket di trasporto come per pr0zac la soluzione 's sopra. Sono anche utilizzando espresso con Socket.IO. Ecco come.

In primo luogo, passare l'ID di sessione alla vista:

app.get('/', function(req,res){
  res.render('index.ejs', {
    locals: { 
      connect_sid: req.sessionID
      // ...
    }
  });
});

Poi, a vostro parere, collegarlo con Socket.IO lato client:

<script>
  var sid = '<%= connect_sid %>';
  var socket = new io.Socket();
  socket.connect();
</script>
<input type="button" value="Ping" onclick="socket.send({sid:sid, msg:'ping'});"/>

Poi, nel tuo lato server Socket.IO ascoltatore, raccoglierla e leggere / scrivere i dati della sessione:

var socket = io.listen(app);
socket.on('connection', function(client){
  client.on('message', function(message){
    session_store.get(message.sid, function(error, session){
      session.pings = session.pings + 1 || 1;
      client.send("You have made " + session.pings + " pings.");
      session_store.set(message.sid, session);  // Save the session
    });
  });
});

Nel mio caso, il mio session_store è Redis, utilizzando la libreria redis-connect.

var RedisStore = require('connect-redis');
var session_store = new RedisStore;
// ...
app.use(express.session({ store: session_store }));

Spero che questo aiuti qualcuno che trova questo post, mentre la ricerca di Google (come ho fatto io;)

Vedere questo: Socket.IO Autenticazione

Vorrei suggerire non andare a prendere qualche cosa via client.request... o client.listener... come che non è direttamente collegato all'oggetto client e sempre punto fino all'ultimo utente connesso!

Scopri Socket.IO-connect

Connetti WebSocket Middleware wrapper Socket.IO-node https://github.com/bnoguchi/Socket.IO-connect

Questo vi permetterà di spingere la richiesta Socket.IO (s) verso il basso dello stack middleware di Express / Connect prima di toccarla con gestori di eventi Socket.IO, che vi dà accesso alla sessione, cookie, e altro ancora. Anche se, non sono sicuro che funzioni con tutti i trasporti di Socket.IO.

Si può fare uso di esprimere-socket.io sessione .

Condividere un espresso sessione middleware basato su cookie con socket.io. Funziona con espresso> 4.0.0 e socket.io> 1.0.0 e non sarà compatibile.

Ha lavorato per me !!

È possibile avere uno sguardo a questo: https://github.com/bmeck/session- web-prese

o, in alternativa si può usare:

io.on('connection', function(client) { 
  var session = client.listener.server.viewHelpers; 
  // use session here 
});

Spero che questo aiuti.

Non sono sicuro che sto facendo bene. https://github.com/LearnBoost/socket.io/wiki/Authorizing

Con i dati di handshake, è possibile accedere ai cookie. E nei cookie, si può afferrare connect.sid che è l'id di sessione per ogni cliente. E quindi utilizzare il connect.sid per ottenere i dati di sessione dal database (io parto dal presupposto che si sta utilizzando RedisStore)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top