Express SessionID отличается от SessionID в Cookie

у меня есть соответствующая проблема, используя данный пример. В Примере сеанс используется в WebSocket путем его первой перезагрузки:

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

пытаясь использовать его в моем собственном приложении, я получаю следующее исключение:

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

Я думаю, проблема в том, что никто не определяет переменную sess как session:

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

может быть, у некоторых есть короткое исправление для этого?

проблема решена: я попытался использовать этот пример: https://github.com/DanielBaulig/sioe-demo/blob/master/app.js С Express 3.0 и Redis.

поэтому я создал магазин Redis (connect-redis) вместо хранилища памяти:

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

так как метод parseCookie в connect переместился, я использовал

parseCookie = require('cookie').parse

вместо

connect.utils.parseCookie

для доступа к сеансу в cookie я изменил пример, используя следующее:

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

теперь моя проблема в том, что я не могу загрузить сеанс из Redis, поскольку идентификаторы сеанса отличаются Печать идентификатора сеанса на странице (req.sessionID) получаю: n+57bnkLr+iXkMLbStWdFzK5 Но в Redis хранится следующий ID:

[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

очевидно, req.sessionID является частью SessionID, сохраненного в cookie / redis-но почему? И какой правильный код?

1 ответов


посмотрите на этот кусок кода промежуточное ПО сеанса ( строка 267 ):

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

здесь sign