2012-08-10 68 views
3

我有一個Backbone應用程序,它使用un/pw查詢我的Express服務器,進行身份驗證,然後將帳戶信息(來自MongoDB)以及新的sessionID回到客戶端。當我需要更多數據時,我將會話ID附加到.fetch()選項。但是,Express會創建一個新會話,即使我的會話已成功存儲在Redis中。Express.js 3與來自Backbone.js的每個XHR請求創建新會話

下面是檢查,如果客戶端試圖與我的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 [email protected] 
pw matches 
{ cookie: 
    { path: '/', 
    _expires: null, 
    originalMaxAge: null, 
    httpOnly: true }, 
    account: 
    { _id: 500471eb8bfff124ce984917, 
    dtAdd: '2012-07-16T20:07:58.671Z', 
    email: '[email protected]', 
    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 } } 
+0

任何解決方案?有同樣的問題。 – Patrick 2012-10-22 10:11:05

+0

@帕特里克不幸的不是。我結束了恢復到Express 2,它再次運作。 – 2012-10-23 14:13:48

回答

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']) 

工作。

相關問題