如何使用heroku + node.js + express设置安全cookie?

时间:2013-01-22 17:01:52

标签: node.js cookies heroku express

我在Cedar堆栈上运行了一个node.js应用程序,我很困惑为什么安全cookie无效。

"express": "3.0.3",
"node": ">=0.8.14",

...
app.use(express.session({
        secret : 'somesecret',
        store : // store works fine, sessions are stored
        key : 'sid',
        cookie : {
            secure : true, // it works without the secure flag (cookie is set)
            proxy : true,  // tried using this as well, no difference
            maxAge: 5184000000 // 2 months
        }
}));
...

在localhost上一切正常,但在heroku上我似乎无法设置安全cookie。我究竟做错了什么? docs表示负载均衡器终止SSL,是否需要在那里进行配置? 非常感谢

3 个答案:

答案 0 :(得分:14)

解决方案

问题是我将proxy: true设置在错误的位置,它应如下所示:

...
app.enable('trust proxy'); // optional, not needed for secure cookies
app.use(express.session({
    secret : 'somesecret',
    store : ..., // store works fine, sessions are stored
    key : 'sid',
    proxy : true, // add this when behind a reverse proxy, if you need secure cookies
    cookie : {
        secure : true,
        maxAge: 5184000000 // 2 months
    }
}));
...

如果您想在Heroku托管应用中的某处使用app.enable('trust proxy');,请添加@friism建议的req.protocol

答案 1 :(得分:10)

Heroku在到达您的应用之前终止SSL是正确的。这导致express显示非ssl流量,这可能是为什么它在Heroku上运行时拒绝设置cookie。

Heroku使用原始协议设置X-Forwarded-Proto标头。我没有对此进行测试,但根据文档,您必须通过将trust proxy设置为已记录的here来告诉express尊重该标头中的信息。 req.protocol here下的其他详细信息。

答案 2 :(得分:0)

如果你正在使用cookie-session,它应该如下所示:

  app.use require('cookie-session') 
    secret: '<secret>'
    secureProxy: true