2012-12-03 17 views
9

Mam odpowiedni problem, korzystając z podanego przykładu. Na przykład, sesja jest stosowany w websocket przez przeładowywania go najpierw:Express SessionID różni się od SessionID w Cookie

socket.on('set value', function (val) { 
    sess.reload(function() { 
     sess.value = val; 
     sess.touch().save(); 
    }); 
    }); 

Starając się go używać w mojej własnej aplikacji, pojawia się następujący wyjątek:

sess.reload(function() { 
    ^
TypeError: Object #<Object> has no method 'reload' 

Myślę, że problem jest, że nikt nie definiuje zmiennej sess jako sesji:

io.listen(app).set('authorization', function (data, accept) { 
    if (!data.headers.cookie) 
    return accept('No cookie transmitted.', false); 

    data.cookie = parseCookie(data.headers.cookie); 
    data.sessionID = data.cookie['express.sid']; 

    store.load(data.sessionID, function (err, session) { 
    if (err || !session) return accept('Error', false); 

    data.session = session; 
    return accept(null, true); 
    }); 
}) 

Może niektóre mają krótką poprawkę?

Problem rozwiązany: Próbowałem użyć tego przykładu: https://github.com/DanielBaulig/sioe-demo/blob/master/app.js z Express 3.0 i Redis.

Dlatego stworzyliśmy Redis Store (connect-Redis) zamiast MemoryStore:

app.use(express.session({cookie: {expires: new Date(Date.now() + 30*60*60*24*1000)}, secret: SESSION_SECRET, key: SESSION_KEY, store: new RedisStore({host:'localhost', port:'6379', client: dbRedis})})); 

Ponieważ parseCookie-Metoda Connect przeniósł użyłem

parseCookie = require('cookie').parse 

zamiast

connect.utils.parseCookie 

Aby uzyskać dostęp do sesji w pliku cookie, zmodyfikowałem przykład: przy użyciu następujących:

sio.set('authorization', function (data, accept) { 
    if (!data.headers.cookie) 
    return accept('No cookie transmitted.', false); 

    data.cookie = parseCookie(data.headers.cookie); 
    log.info('Cookie: $s', JSON.stringify(data.cookie)); 
    data.sessionID = data.cookie['letter.sid']; 
    log.info('SessionId: %s', data.sessionID); 

    dbRedis.get(data.sessionID, function (err, session) { 
    if (err || !session) return accept('Error ' + session, false); 

    data.session = session; 
    return accept(null, true); 
    }); 
}) 

Teraz mój problem jest, że nie mogę załadować sesję z Redis ponieważ identyfikatory sesji różnią Drukowanie identyfikator sesji na stronie (req.sessionID) uzyskać: n + 57bnkLr + iXkMLbStWdFzK5 ale w Redis następujące ID jest przechowywana:

[2012-12-03T22:14:56.632Z] INFO: Postbox/78964 on capns-mba.local: Cookie: $s {"SQLiteManager_currentLangue":"4","connect.sid":"s:xvYdDm5C0MEIg53EG8JgqBnM.Tx8+PMKa570zk6qt9vmCjRz2p/LP/COyyqGSm+VKxww","letter.sid":"s:n+57bnkLr+iXkMLbStWdFzK5.XPHh1xXrK9D4cPfJ7HcHO11PKk8FXLg6fIRGaWb/+jI"} 
[2012-12-03T22:14:56.632Z] INFO: Postbox/78964 on capns-mba.local: SessionId: s:n+57bnkLr+iXkMLbStWdFzK5.XPHh1xXrK9D4cPfJ7HcHO11PKk8FXLg6fIRGaWb/+jI 

Oczywiście req.sessionID jest częścią sessionid zapisanego w pliku cookie/REDiS - ale dlaczego? A która jest poprawna identyfikacja sesji?

+0

Ok jest problem polegający na tym, że nie otrzymuję sesji przy użyciu dbRedis.get(). – Markus

Odpowiedz

15

spojrzenie na ten fragment kodu z session middleware (linia 267):

var val = 's:' + signature.sign(req.sessionID, secret); 

gdzie signature.sign funkcja jest konkatenacją (pseudo-kod):

req.sessionID + "." + hash(secret) 

gdzie hash jest funkcją użytkownika (see this for more details).

Oznacza to, że jest to tylko konwencja podpisywania ciasteczek (aby uczynić go bardziej bezpieczne). Możesz odzyskać swój sid, dzwoniąc pod numer:

var signature = require("cookie-signature"), 
    prefix = "s:"; 

var real_sid = sid.replace(prefix, ""); 
real_sid = signature.unsign(real_sid, SESSION_SECRET); 
+0

Dziękuję rozwiązać mój problem idealnie – Markus

+1

Kilka lat po tym, jak odpowiedziałeś na to, dziś uratowałeś życie mężczyźnie. Dziękuję Ci! :) – geevee

+0

W moim przypadku musiałem wykonać sid = decodeURIC Component (sid); po pierwsze, ponieważ identyfikator sesji jest przechowywany w zakodowanym ciągu w pliku cookie. –

Powiązane problemy