2013-06-25 32 views
4

我使用express(node.js)+ mongodb在單個Heroku dyno上實現了一些用戶認證,並且一切正常。但是,當我增加dynos的數量(超過1個)時,我無法登錄,我一直在我的登錄頁面上重定向,這意味着我的會話尚未設置。這裏是我的代碼:在多個dynos上快速應用程序設置會話heroku app

checkCookies =功能(REQ,水庫,下一個){

if(req.session.user){ 
    res.locals.user = req.session.user; 
    next(); 
    } 
    else{ 
    res.redirect('/login'); 
    } 
}; 
app.use(express.cookieParser()); 
    app.use(express.session({ secret: '0GBlJZ9EKBt2Zbi2flRPvztczCewBxXK', 
    cookie: {httpOnly: true, maxAge:14*24*60*60*1000} 
    })); 

什麼是處理上明示共享會話的最佳解決方案/ Node.js的使用MongoDB的?

回答

5

使用connect-mongo模塊明示。

var http = require('http'), 
    express = require('express'), 
    session = require('connect-mongo')(express) 

然後在你的工人設置會話中存儲外部。下面的代碼將使用來自mongo,cookies和額外頭文件的會話,以允許跨域和jsonp。

app.configure(function() { 
    app.use(express.cookieParser()); 
    app.use(express.session({ 
    store: new session({ 
     db: 'sessions' 
    }), 
    secret: 'yoursecret', 
    cookie: { 
     path: '/', 
     maxAge: 1000 * 60 * 60 * 24 // 1 day 
    } 
    })); 
    app.use(function(req, res, next) { 
    res.header('Access-Control-Allow-Credentials', true); 
    res.header('Access-Control-Allow-Origin', req.headers.origin); 
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); 
    res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept'); 
    next(); 
    }); 
    app.set('jsonp callback', true); 
}); 
+0

感謝您進一步解釋!你能告訴我允許跨域和jsonp的優勢嗎?或者告訴我在哪裏可以讀到關於它的一些信息?我谷歌它並沒有什麼幫助出來 –

+1

如果你將有example.com網站,並且將從它的JS AJAX請求調用api.com - 這將是你的節點應用程序,那麼它不會允許在大多數瀏覽器由於安全限制。 您已在服務器端啓用此功能以允許從其他域訪問,並且您必須另外添加JSONP並在需要舊版瀏覽器支持時使用它。 如果您想要共享會話cookie數據,則需要爲ajax請求添加額外的位,對於jQuery,它將是'xhrFields:{withCredentials:true}'。 查看更多的信息在這裏:http://goo.gl/Y1XK0 – moka

4

上述答案具有誤導性,因爲它們暗示您無法在Heroku上的多個dynos上共享基於cookie的會話。

如果我使用cookie-session而不是express-session,我可以在多個dynos上使用基於cookie的會話。此線程中第一篇文章中缺少的是祕密值不傳遞給cookie分析器。這意味着,每當進程重新啓動或新的測試儀啓動時,節點將爲解析器分配一個隨機哈希。

做了以下工作對我來說:

app.use(express.cookieParser('0GBlJZ9EKBt2Zbi2flRPvztczCewBxXK')); 
    app.use(express.session({ secret: '0GBlJZ9EKBt2Zbi2flRPvztczCewBxXK', 
    cookie: {httpOnly: true, maxAge:14*24*60*60*1000} 
    })); 
+0

優秀的答案;非常感謝! –

相關問題