Frage

Ich verwende ausdrücklich Rahmen. Ich möchte Sitzungsdaten aus socket.io erreichen. Ich habe versucht, express dynamicHelpers mit client.listener.server.dynamicViewHelpers Daten, aber ich kann nicht die Sitzungsdaten bekommen. Gibt es eine einfache Möglichkeit, dies zu tun? Bitte beachten Sie den Code

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
    }); 
});
War es hilfreich?

Lösung

Das wird nicht funktionieren für Steckdosen über den flashsocket Transport geht (es den Server nicht die benötigten Cookies senden), aber es funktioniert zuverlässig für alles andere. Ich deaktivieren nur den flashsocket Transport in meinem Code.

Damit es funktioniert, in der Express / connect Seite, ich den Session-Speicher explizit definieren, damit ich es innerhalb Steckdose verwenden kann:

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

Dann in meinem Socket-Code, schließe ich die Verbindungsrahmen, damit ich seine Cookie-Analyse können Sie die connect.sid von Cookies abzurufen. Ich schaue dann die Sitzung in der Sitzung speichern, dass diese connect.sid hat etwa so:

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!!!!
    });
  }
});

Sie können dann die Sitzung verwenden je nach Bedarf.

Andere Tipps

Die Socket.IO-Sitzungen Modullösung die App XSS-Angriffe setzt durch die Session-ID an den Client (Scripting) Ebene ausgesetzt wird.

Überprüfen Sie diese Lösung statt (für Socket.IO> = v0.7). Siehe docs hier .

schlage ich nicht ganz das Rad neu zu erfinden. Die Werkzeuge, die Sie brauchen, ist bereits ein npm package.I denke, das ist, was Sie brauchen: session.socket.io Ich benutze es in diesen Tagen, und es wird sehr hilfreich sein, ich denke, !! Die Verknüpfung der Express-Sitzung auf die socket.io Schicht wird so viele Vorteile haben!

Edit: einige Module Nach dem Versuch, die nicht funktioniert hat, habe ich eigentlich gegangen und meine eigene Bibliothek geschrieben, dies zu tun. Shameless Stecker: gehen check it out bei https://github.com/aviddiviner/Socket.IO-sessions .

: Ich werde meinen alten Beitrag unten aus historischen Gründen verlassen

Ich habe diese Arbeit ganz ordentlich, ohne mit Bypass des flashsocket Transport per pr0zac 's Lösung oben. Ich verwende ausdrücklich auch mit Socket.IO. Hier ist, wie.

Zuerst passiert die Session-ID zu der Ansicht:

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

Dann in Ihrer Ansicht verknüpft es mit Socket.IO Client-Seite:

<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'});"/>

Dann in Ihrem serverseitigen Socket.IO Zuhörer, es abholen und lesen / schreiben die Sitzungsdaten:

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
    });
  });
});

In meinem Fall mein session_store ist Redis, die redis-connect Bibliothek.

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

Hope, das hilft jemand, der diesen Beitrag findet während der Suche Google (wie ich;)

Sehen Sie diese: Socket.IO Authentifizierung

Ich würde vorschlagen, nichts über client.request... holen oder client.listener... wie die nicht direkt mit dem client Objekt angebracht ist und immer Punkt zum letzten angemeldeten Benutzer!

Überprüfen Sie heraus Socket.IO-connect

Connect WebSocket Middleware-Wrapper um Socket.IO-Knoten https://github.com/bnoguchi/Socket.IO-connect

Dies ermöglicht Ihnen, die Socket.IO Anfrage (n) auf der Express / Connect-Middleware-Stack zu drücken, bevor es mit Socket.IO Event-Handler Handhabung, so dass Sie auf die Sitzung zugreifen, Cookies und vieles mehr. Obwohl, ich bin nicht sicher, dass es mit allen Socket.IO der Transporte funktioniert.

Sie können von machen Express-socket.io-Sitzung .

Teile einer Cookie-basierte Express-Session-Middleware mit socket.io. Arbeiten mit ausdrücklichem> 4.0.0 und socket.io> 1.0.0 und nicht rückwärtskompatibel sein.

Für mich arbeiten !!

Sie können einen Blick auf diese: https://github.com/bmeck/session- Web-Steckdosen

oder alternativ können Sie:

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

Hope, das hilft.

Ich bin nicht sicher, dass ich es richtig mache. https://github.com/LearnBoost/socket.io/wiki/Authorizing

Mit den Handshake-Daten können Sie auf die Cookies zugreifen. Und in den Cookies, können Sie connect.sid greifen, die die Session-ID für jeden Client ist. Und dann die connect.sid verwenden, um die Sitzungsdaten aus der Datenbank zu erhalten (Ich gehe davon aus Sie RedisStore verwenden)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top