2013-10-23 51 views
1

我試圖解決在socket.io內訪問會話變量臭名昭着的問題。我已經閱讀了Google上關於該主題的所有鏈接,而且我仍在掙扎。快速cookieSession鍵不顯示在數據頭

我所有的路由後,我有這樣的:

io.set('authorization', function(data,accept) 
{ 
    data.cookie = cookie.parse(data.headers.cookie); 
    ---> console.log(data.cookie); 
    data.sessionID = connect.utils.parseSignedCookie(data.cookie['express.sid'].split('.')[0].substring(2), conf.sessionSecret); 

    sessionStore.get(data.sessionID, function (err, session) 
    { 
     console.log(session); 
    }); 
}); 

不幸的是,我畫了一個箭頭來回報這個的console.log:

{ 'connect.sid': 's:3pIi31DPthO8KVOjqzYpeL75.nHvKOpMZsUsyto7CtBJgcJZIiBSN+IC2/aD0GcfYftU' } 

所以當然,我得到一個錯誤express.sid未定義。 當我將express.sid更改爲connect.sid時,我的會話變量未定義。

我真的很努力地解決這個問題 - 我已經在它幾個小時。任何幫助?

編輯: 總結我解決的問題:

  1. 在app.config中,我使用的,而不是會議cookieSession
  2. 我的當事人被連接到我的服務器的端口轉發,外部IP版本。這不包含cookie數據。
  3. .split('。')[0] .substring(2)查找會話ID時絕對必要
  4. 在io.set('authorization,function(handshake,callback)... must call 「回調(NULL,TRUE)」,以使socket.io連接正常進行

回答

1

你是八九不離十。實際上,你之前它傳遞給解析器不需要修改的cookie。

io.set('authorization', function(handshake, callback) { 
    handshake.cookie = cookie.parse(handshake.headers.cookie); 
    handshake.sessionID = connect.utils.parseSignedCookie(handshake.cookie['express.sid'], conf.sessionSecret); 

    sessionStore.get(handshake.sessionID, function(err, session) { 
    // the session would be here 
    }); 
}); 

但是,由於您有權訪問cookie解析器中間件,我個人會這樣做:

var parseCookie = express.cookieParser(conf.sessionSecret); 
io.set('authorization', function(handshake, callback) { 
    if (handshake.headers.cookie) { 
    parseCookie(handshake, null, function(err) { 
     handshake.sessionID = handshake.signedCookies['express.sid']; 
     sessionStore.get(handshake.sessionID, function(err, session) { 
     // the session would be here 
     }); 
    }); 
    } 
}); 

這種方法收集Cookie的分析過程中是可能的任何錯誤,並通過將handshake對象,就好像它是一個HTTP請求對象,因爲它們都具有headers.cookie性質的作品。然後,cookie解析器將解析cookie並將它們分配給handshake對象,以便您可以從handshake.signedCookies中找到會話ID。

+1

啊是的,刪除'headers.cookie'部分。對不起,我們也會編輯這個例子。 – hexacyanide

+1

handshake.signedCookies爲空。你知道這是爲什麼嗎? – Harangue

+0

你能展示更多的代碼嗎? – hexacyanide