Session Express.js 3使用来自Backbone.js的每个XHR请求创建新会话
我有一个主干应用程序,它使用un/pw查询我的Express服务器,进行身份验证,然后将帐户信息(来自MongoDB)和新的sessionID一起发送回客户端。当需要更多数据时,我会将会话id附加到.fetch()选项。但是,Express创建了一个新会话,即使我的会话已成功存储在Redis中 下面是一个中间件,它检查客户机是否正在尝试使用我的apiSession Express.js 3使用来自Backbone.js的每个XHR请求创建新会话,session,backbone.js,xmlhttprequest,express,connect,Session,Backbone.js,Xmlhttprequest,Express,Connect,我有一个主干应用程序,它使用un/pw查询我的Express服务器,进行身份验证,然后将帐户信息(来自MongoDB)和新的sessionID一起发送回客户端。当需要更多数据时,我会将会话id附加到.fetch()选项。但是,Express创建了一个新会话,即使我的会话已成功存储在Redis中 下面是一个中间件,它检查客户机是否正在尝试使用我的api var _restrictApi = function(req, res, next) { if (req.url.match(/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();
}
};
我的主干应用程序在加载时会进行一些.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 } }
通过对会话ID进行签名来创建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'])
那就行了。有什么解决办法吗?有同样的问题。@Patrick不,不幸的是没有。最后我又回到了Express 2,它又开始工作了。