14

我在 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。我究竟做错了什么?文档说负载均衡器终止了 SSL,是否需要在那里配置?
多谢

4

3 回答 3

17

解决方案

问题是我设置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
    }
}));
...

app.enable('trust proxy');如果您想req.protocol在 Heroku 托管应用程序中的某个地方使用,请添加@friism 建议的内容。

于 2013-01-23T06:15:14.167 回答
15

Heroku 在 SSL 到达您的应用程序之前终止它是正确的。这会导致 express 看到非 SSL 流量,这可能是它在 Heroku 上运行时拒绝设置 cookie 的原因。

HerokuX-Forwarded-Proto使用原始协议设置标头。我没有对此进行测试,但是根据文档,您必须通过设置trust proxy为文档的here来告诉 express 尊重该标题中的信息。req.protocol 可在此处找到其他详细信息。

于 2013-01-22T17:59:19.747 回答
1

如果您使用的是cookie-session,它应该如下所示:

app.use require('cookie-session') 
   secret: '<secret>'
   secureProxy: true
于 2014-10-06T22:29:34.573 回答