2012-07-18 114 views
15

我正在使用WebSocket npm install ws與Express運行在同一端口上。如何獲得(Express)會話ID以用於WebSocket連接

我想從剛建立並升級到WebSocket的HTTP連接中獲取關聯的'sessionID'。

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

這怎麼辦?

(我目前解決該問題通過在頁面發送會話ID,但是這是醜陋的。)

回答

14
  1. 解析餅乾
  2. 獲取會話ID
  3. 獲取會話數據

    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

這是在正確的軌道上,但沒有'sid'cookie。有:'connect.sid:n8Pbh5hPhNNC3B6PAkyuaRgv.o9wnmI3fiJ47kJMUfW0xVcMRkhjFkMbgvki/CTtemvU'和'sessionid:12d2b0c6f3c3eb661215a401d1942122'。其中哪一個是會話的關鍵,另一個是什麼? – fadedbee 2012-07-18 14:16:22

+0

'connect.sid'是快速cookie的默認鍵。在上面的代碼中,表示配置的會話密鑰是'sid'...如果你不定製它,密鑰是'connect.sid'。 – nguyenkha 2012-07-18 14:23:59

+0

啊,我的錯只是粘貼了一半的代碼。 – fadedbee 2012-07-18 14:25:39

5

這是一場噩夢,終於讓它爲我自己使用簽名的餅乾工作!

設置你的商店(例如內存存儲):

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

暴露parseCookie全球(如果你需要它在其他模塊)這樣的應用程序/服務器js文件:

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

現在設置套接字:

//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

關於Node的一切目前都是一場噩夢。所有的信息都缺乏這麼多重要的東西......任何地方都沒有解釋,事情被認爲是理所當然的。 – vsync 2013-08-07 14:28:46

+0

@vsync L2網頁應用程序先生。 – 2013-11-25 21:53:11

+0

我發現它比php更好,因爲我做了很多項目前端和後端,通用語言對我來說更好。 – mattdlockyer 2013-11-26 20:31:07