2012-07-18 20 views
15

Używam WebSockets npm install ws na tym samym porcie, na którym działa Express.Jak mogę uzyskać (Express's) sessionID dla połączenia z internetem

Chciałbym odebrać skojarzone "sessionID" z połączenia HTTP, które właśnie zostało wykonane i uaktualnione do WebSocket.

// start express listening 
server.listen(conf.server.port, conf.server.host); 

var WebSocketServer = require('ws').Server 
    , wss = new WebSocketServer({server: server}); 

wss.on('connection', function(ws) { 
    var sessionID = // how do I get this? 
    ws.on('message', function(message) { 
     console.log('received: %s', message); 
    }); 
    ws.send('something'); 
}); 

Jak można tego dokonać?

(I obecnie obejść ten problem poprzez wysłanie sessionid na stronie, ale to jest brzydkie.)

Odpowiedz

14
  1. Parse cookies
  2. Uzyskaj identyfikator sesji
  3. uzyskać dane sesyjne

    var express = require('express'); 
    var parseCookie = express.cookieParser(); 
    var MemoryStore = express.session.MemoryStore; 
    
    var store = new MemoryStore(); 
    
    app.configure(function() { 
        app.use(express.session({ store: store, secret: '123456', key: 'sid' })); 
    }); 
    
    wss.on('connection', function(ws) { 
        parseCookie(ws.upgradeReq, null, function(err) { 
         var sessionID = ws.upgradeReq.cookies['sid']; 
         store.get(sessionID, function(err, session) { 
          // session 
         }); 
        }); 
    
        ws.on('message', function(message) { 
         console.log('received: %s', message); 
        }); 
        ws.send('something'); 
    }); 
    
+1

to jest na dobrej drodze, ale nie ma „sid” ciasteczko. Istnieją: 'connect.sid: n8Pbh5hPhNNC3B6PAkyuaRgv.o9wnmI3fiJ47kJMUfW0xVcMRkhjFkMbgvki/CTtemvU' i' sessionid: 12d2b0c6f3c3eb661215a401d1942122'. Który z nich jest kluczem do sesji, a jaki jest drugi? – fadedbee

+0

"connect.sid" to domyślny klucz do ekspresowego pliku cookie. W powyższym kodzie ekspres był skonfigurowany, a klucz sesji to "sid" ... jeśli nie dostosujesz go, klucz to "connect.sid". – nguyenkha

+0

Ach, moja wina za wklejenie tylko połowy kodu. – fadedbee

5

To był koszmar, w końcu udało się to dla mnie za pomocą podpisanych ciasteczek!

Skonfiguruj (sklep przykład pamięci) sklep:

var MemoryStore = express.session.MemoryStore; 
store = new MemoryStore(); 

Expose parseCookie jako globalny (jeśli jest to potrzebne w innych modułów) jak to w plikach app/Server JS:

app.use(parseCookie = express.cookieParser('secret')); 

teraz utworzyć gniazda:

//this method gets called later 
var ensureAuthenticatedSocket = function(handshake, callback) { 
    cookie = cookieParser(handshake, null, function(err) { 
     var sessionID = handshake.signedCookies['sid']; 
     store.get(sessionID, function(err, session) { 
      callback(err, session); 
     }); 
    }); 
}; 
//listen time 
io = io.listen(server); 
//configure authentication 
io.configure(function() { 
    io.set('authorization', function(handshake, callback) { 
     //call the method with handshake as parameter, wait for callback 
     ensureAuthenticatedSocket(handshake, function(err, session) { 
      if (!err && session) { 
       //no error + found session = wicked! 
       callback(null, true); 
      } else { 
       callback(null, false); 
      } 
     }); 
    }); 
}); 
... 
//more socket code 
+5

Wszystko o węzeł jest aktualnie koszmar. wszystkie informacje brakuje TAK WIELU istotnych rzeczy .. Brak wyjaśnień wszędzie, rzeczy są brane za pewnik. – vsync

+0

@vsync L2 aplikacja internetowa sir. –

+0

Uważam, że jest lepszy niż php, a ponieważ wykonuję wiele projektów z przodu i z tyłu, wspólny język jest dla mnie znacznie lepszy. – mattdlockyer

Powiązane problemy