【问题标题】:Express session-cookie not being sent on openshift with https and secure flag使用 https 和安全标志在 openshift 上未发送 Express session-cookie
【发布时间】:2017-03-16 04:29:49
【问题描述】:

遇到了一个奇怪的问题,我正在使用 Express,在开发中我们使用 http 并使用 secure: false 作为会话 cookie,但是现在我们正在转向 openshift,我们已经打开 https,认为这将是一个简单的尝试,但我们的 cookie没有与响应一起发回。但是,如果我们关闭 https 并在 openshift 上恢复为 http,它可以正常工作并发送 cookie。

以下是 cookie 配置的示例:

var setupSession = function() {
    var sessionConfig = {
        secret: environmentVars.cookie.secret,
        name: environmentVars.cookie.name,
        maxAge: environmentVars.cookie.expiry,
        domain: environmentVars.cookie.domain,
        httpOnly: true,
        secure: environmentVars.cookie.secure, // true when using https
        secureProxy: environmentVars.cookie.secure, // true when using https
        signed: true
    };
    app.set('trust proxy', 1); // Just added this, still no luck
    app.use(session(sessionConfig));
};

所以上面是在应用程序启动时运行的,如 cmets 中所述,当我们使用安全连接时,会为我们设置环境变量,当上面与 HTTPS 结合使用时,不会从快递,但是 openshift cookie 被发回,比如一号齿轮等。再次使用 http 并禁用安全的东西它工作正常,我们都得到了 cookie 并欢欣鼓舞。所有响应都正常工作,数据被发回,只是应用程序 cookie 缺少 set-cookie 标头(但如前所述,不是 openshift 的)。

因此,实际的证书不是在 nodejs 中设置的,而是在 openshift 上设置为应用证书的别名。所以 express 真的不知道它是在 https 中运行的,除了它传递的环境变量和运行它的设备提供的端口。

那么有没有其他人有类似的事情,或者对我们可以尝试解决问题或诊断问题有什么想法?我做了一些阅读,人们建议尝试 trust proxy 和 secureProxy,这已经完成但仍然没有成功。

【问题讨论】:

  • 查看这个问题的答案:stackoverflow.com/questions/14463972/… 同样的解决方案应该适用于 OpenShift。
  • 哈哈!这不是你所期望的原因,我已经在做前面提到的代理,但是安全位应该在我没有做的 cookie: 属性内。所以会发布答案。

标签: node.js cookies https openshift


【解决方案1】:

原来我只是个白痴,应该是这样的:

var setupSession = function() {
    var sessionConfig = {
        secret: environmentVars.cookie.secret,
        name: environmentVars.cookie.name,
        maxAge: environmentVars.cookie.expiry,
        domain: environmentVars.cookie.domain,
        httpOnly: true,            
        secureProxy: environmentVars.cookie.secure, // true when using https
        signed: true,
        cookie: {
            secure: environmentVars.cookie.secure, // true when using https
        }
    };
    app.set('trust proxy', 1); // Just added this, still no luck
    app.use(session(sessionConfig));
};

现在一切正常:)

【讨论】:

  • 在没有 HTTPS 的情况下是否适合您?我正在尝试一切,对于其他反向代理它可以工作,但在 openshift 上我从来没有得到一个 cookie :(
【解决方案2】:

我在 express-session 上遇到了类似的问题,经过多次试验,我的罪魁祸首是设置 cookie.domain。浏览器不会保存 cookie。

这就是我设置值的方式:

cookie: { 
  ...
  domain: process.env.OPENSHIFT_CLOUD_DOMAIN,
  ...
}

希望它可以帮助任何人经历同样的事情,因为当时这是最适合分享这个的 stackoverflow 问题。

【讨论】:

    猜你喜欢
    • 2017-09-11
    • 2014-08-11
    • 2021-08-26
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 2018-01-05
    • 2019-05-18
    相关资源
    最近更新 更多