Question

J'utilise le cadre express. Je veux atteindre les données de session socket.io. J'ai essayé dynamicHelpers express avec des données de client.listener.server.dynamicViewHelpers, mais je ne peux pas obtenir des données de session. Est-il un moyen simple de le faire? S'il vous plaît voir le 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
    }); 
});
Était-ce utile?

La solution

Cela ne fonctionnera pas pour les prises en cours sur le transport flashsocket (il ne transmet pas le serveur cookies nécessaires), mais il fonctionne de manière fiable pour tout le reste. Désactiver juste le transport flashsocket dans mon code.

Pour le faire fonctionner, dans le côté express / connexion, je définis de façon explicite la boutique de la session pour que je puisse l'utiliser dans la prise:

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

Ensuite, à l'intérieur de mon code de prise, je comprend le cadre de connexion afin que je puisse utiliser son analyse syntaxique des cookies pour récupérer le connect.sid des cookies. Je regarde alors la session dans le magasin de la session qui a cette connect.sid comme ceci:

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

Vous pouvez ensuite utiliser la session au besoin.

Autres conseils

La solution Module Socket.IO-sessions expose l'application aux attaques XSS en exposant l'ID de session au niveau du client (script).

Cochez cette solution au lieu (pour Socket.IO> = v0.7). Voir docs .

Je suggère de ne pas réinventer la roue entièrement. Les outils dont vous avez besoin est déjà un package.I de NPM pense que c'est ce que vous devez: session.socket.io Je l'utilise dans ces jours et il sera très utile, je suppose !! Lier l'Express session à la couche de socket.io aura tant d'avantages!

Modifier Après avoir essayé quelques modules qui ne fonctionnait pas, je suis en fait parti et écrit ma propre bibliothèque pour le faire. Shameless plug: go check it out https://github.com/aviddiviner/Socket.IO-sessions . Je vais laisser mon ancien poste ci-dessous à des fins historiques:


je me suis tout à fait ce travail d'une manière ordonnée sans avoir à contourner le flashsocket Transport selon pr0zac solution de ci-dessus. Je suis également en utilisant express avec Socket.IO. Voici comment.

Tout d'abord, passer l'ID de session à la vue:

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

Alors à votre avis, lier avec côté client Socket.IO:

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

Ensuite, dans votre côté serveur auditeur Socket.IO, ramasser et lire / écrire les données de session:

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

Dans mon cas, mon session_store est Redis, en utilisant la bibliothèque redis-connect.

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

Espérons que cela aide quelqu'un qui trouve ce poste lors de la recherche Google (comme je l'ai fait;)

Voir ceci: Socket.IO authentification

Je suggère de ne pas aller chercher quoi que ce soit par l'intermédiaire client.request... ou client.listener... que ce n'est pas attaché directement à l'objet client et toujours le point au dernier utilisateur connecté!

Consultez Socket.IO-connect

Connectez WebSocket Middleware wrapper autour Socket.IO-noeud https://github.com/bnoguchi/Socket.IO-connect

Cela vous permettra de pousser la demande Socket.IO (s) vers le bas de l'Express / Connect pile middleware avant de le manipuler avec des gestionnaires d'événements Socket.IO, vous donnant accès à la session, les cookies, et plus encore. Bien, je ne suis pas sûr que cela fonctionne avec tous les transports de Socket.IO.

Vous pouvez utiliser express-socket.io session .

Partager un middleware express de session basée sur les cookies avec socket.io. Fonctionne avec express> 4.0.0 et socket.io> et ne seront pas 1.0.0 rétrocompatible.

A travaillé pour moi !!

Vous pouvez jeter un oeil à ceci: https://github.com/bmeck/session- Assemblages web

ou vous pouvez également utiliser:

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

Hope this helps.

Je ne suis pas sûr que je le fais bien. https://github.com/LearnBoost/socket.io/wiki/Authorizing

Avec les données de prise de contact, vous pouvez accéder aux cookies. Et dans les cookies, vous pouvez saisir connect.sid qui est l'identifiant de session pour chaque client. Et puis utilisez la connect.sid pour obtenir les données de session de base de données (je suppose que vous utilisez RedisStore)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top