首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Express SessionID与SessionID在Cookie中的不同

Express SessionID与SessionID在Cookie中的不同
EN

Stack Overflow用户
提问于 2012-12-03 22:43:11
回答 1查看 8.2K关注 0票数 13

我有一个相应的问题,通过使用给定的例子。在该示例中,通过首先重新加载会话,在WebSocket中使用该会话:

代码语言:javascript
复制
  socket.on('set value', function (val) {
    sess.reload(function () {
      sess.value = val;
      sess.touch().save();
    });
  });

尝试在我自己的应用程序中使用它时,我得到以下异常:

代码语言:javascript
复制
  sess.reload(function () {
       ^
TypeError: Object #<Object> has no method 'reload'

我认为问题在于,没有人将变量sess定义为session:

代码语言:javascript
复制
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与Exchange3.0和Redis。

因此,我创建了一个MemoryStore(Connect),而不是MemoryStore:

代码语言:javascript
复制
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-方法移动了,所以我使用了

代码语言:javascript
复制
parseCookie = require('cookie').parse

而不是

代码语言:javascript
复制
connect.utils.parseCookie

为了访问cookie中的会话,我使用以下方法修改了这个示例:

代码语言:javascript
复制
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加载会话,因为会话ID在我得到的页面(req.sessionID: n+57bnkLr+iXkMLbStWdFzK5 )上打印会话ID不同,但是在Redis中存储了以下ID:

代码语言:javascript
复制
[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是保存在cookie/redis中的SessionID的一部分--但是为什么呢?哪个是正确的sessionID?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-03 23:00:56

查看session middleware中的这段代码(第267行):

代码语言:javascript
复制
var val = 's:' + signature.sign(req.sessionID, secret);

其中signature.sign函数是级联(伪代码):

代码语言:javascript
复制
req.sessionID + "." + hash(secret)

其中hash是一个自定义函数( see this for more details )。

这意味着它只是cookie的一个签名约定(为了使它更安全)。您可以通过以下方式检索您的sid:

代码语言:javascript
复制
var signature = require( "cookie-signature" ),
    prefix = "s:";

var real_sid = sid.replace( prefix, "" );
real_sid = signature.unsign( real_sid, SESSION_SECRET );
票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13693101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档