【问题标题】:Express.js 3 creates new sessions with each XHR request from Backbone.jsExpress.js 3 使用来自 Backbone.js 的每个 XHR 请求创建新会话
【发布时间】:2012-08-08 04:46:40
【问题描述】:

我有一个 Backbone 应用程序,它使用 un/pw 查询我的 Express 服务器,进行身份验证,然后将帐户信息(来自 MongoDB)连同新的 sessionID 一起发送回客户端。当我需要更多数据时,我将会话 ID 附加到 .fetch() 选项。但是,Express 会创建一个新会话,即使我的会话已成功存储在 Redis 中。

这是检查客户端是否尝试使用我的 api 的中间件

var _restrictApi = function(req, res, next) {
  if (req.url.match(/api/)) {
    res.xhrAuthValid = req.param('sessionId') == req.sessionID;
    if (res.xhrAuthValid || (req.method=='GET' && req.url.match(/api\/account/))) {
      console.log('API access granted', req.url);
      console.dir(req.session);
      next();
    } else {
      console.log('API access BLOCKED', req.url);
      console.log(req.param('sessionId'), req.sessionID);
      console.dir(req.session);
      res.send(403, 'Forbidden');
    }
  } else {
    next();
  }
};

我的 Backbone 应用在加载时会调用几次 .fetch()。首先,登录,然后为用户获取事件。这是 Express 服务器控制台日志:

API access granted /api/account?email=test%40gmail.com&password=somepw
{ cookie: 
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true } }
_checkAccount test@gmail.com
pw matches
{ cookie: 
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true },
  account: 
   { _id: 500471eb8bfff124ce984917,
     dtAdd: '2012-07-16T20:07:58.671Z',
     email: 'test@gmail.com',
     pwHash: '$2a$10$2KJXrZeAGW58Kp9JQDL9B.K2Fvu2oE3oqWKRl55o8MeXGHA/zCBE.',
     sessionId: 'iqYjOA7CeQHny9cm8zOWERjv' } }
API access BLOCKED /api/events?accountId=500471eb8bfff124ce984917&sessionId=iqYjOA7CeQHny9cm8zOWERjv
iqYjOA7CeQHny9cm8zOWERjv rsSXKtzXNNiq8x3+pUN9JXWF
{ cookie: 
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true } }

【问题讨论】:

  • 有什么解决办法吗?遇到同样的问题。
  • @Patrick 不,不幸的是没有。我最终恢复到 Express 2 并且它再次工作。

标签: session backbone.js xmlhttprequest express connect


【解决方案1】:

通过签署 sessionID 创建一个 connect.sid:

cookie = require('cookie-signature')
res.send('connect.sid=s%3A'+cookie.sign(req.sessionID, req.secret))

将其存储在本地存储中,并为每个 AJAX 请求设置 Cookie 标头:

r.setRequestHeader('Cookie', window.localStorage['connect.sid'])

这行得通。

【讨论】:

    猜你喜欢
    • 2015-09-25
    • 2015-07-25
    • 2018-11-05
    • 2013-07-26
    • 2020-07-13
    • 2019-01-16
    • 2018-09-16
    • 2021-06-15
    • 2013-10-26
    相关资源
    最近更新 更多