Express session-cookie 未在带有 https 和安全标志的 openshift 上发送
Express session-cookie not being sent on openshift with https and secure flag
遇到一个奇怪的问题,我正在使用 Express,在开发中我们使用 http 并为 session cookie 使用 secure: false
,但是现在我们正在转向 openshift,我们认为它已经打开了 https将是一项简单的工作,但我们的 cookie 不会随响应一起发回。但是,如果我们在 openshift 上关闭 https 并恢复为 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));
};
所以上面是 运行 当应用程序启动时,正如评论中所指出的,当我们使用安全连接时,环境变量是为我们设置的,当上面与 HTTPS 结合使用时没有 cookie 从 express 发回,但是 openshift cookie 被发回,比如 gears one 等。再次使用 http 并禁用安全的东西它工作正常我们都得到了 cookie 并且很高兴。所有响应都有效并且数据被发回它只是应用程序 cookie 缺少 set-cookie header(但如前所述,不是 openshift 的)。
所以实际的证书不是在 nodejs 中设置的,而是在 openshift 上设置为应用了证书的别名。所以 express 真的不知道它在 https 中是 运行 除了它传递的环境变量和它由 运行 连接它的齿轮提供的端口。
那么有没有其他人有类似的事情或对我们可以尝试解决或诊断问题的方法有任何想法?我做了一些阅读,人们建议尝试使用信任代理和 secureProxy,这已经完成但仍然没有成功。
原来我是白痴,应该是这样的:
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));
};
现在一切正常:)
我在使用 express-session 时遇到了类似的问题,经过多次试验,我的罪魁祸首是设置 cookie.domain。浏览器不会保存 cookie。
这是我设置值的方式:
cookie: {
...
domain: process.env.OPENSHIFT_CLOUD_DOMAIN,
...
}
希望它能帮助任何遇到同样问题的人,因为当时这是最适合分享这个的 Whosebug 问题。
遇到一个奇怪的问题,我正在使用 Express,在开发中我们使用 http 并为 session cookie 使用 secure: false
,但是现在我们正在转向 openshift,我们认为它已经打开了 https将是一项简单的工作,但我们的 cookie 不会随响应一起发回。但是,如果我们在 openshift 上关闭 https 并恢复为 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));
};
所以上面是 运行 当应用程序启动时,正如评论中所指出的,当我们使用安全连接时,环境变量是为我们设置的,当上面与 HTTPS 结合使用时没有 cookie 从 express 发回,但是 openshift cookie 被发回,比如 gears one 等。再次使用 http 并禁用安全的东西它工作正常我们都得到了 cookie 并且很高兴。所有响应都有效并且数据被发回它只是应用程序 cookie 缺少 set-cookie header(但如前所述,不是 openshift 的)。
所以实际的证书不是在 nodejs 中设置的,而是在 openshift 上设置为应用了证书的别名。所以 express 真的不知道它在 https 中是 运行 除了它传递的环境变量和它由 运行 连接它的齿轮提供的端口。
那么有没有其他人有类似的事情或对我们可以尝试解决或诊断问题的方法有任何想法?我做了一些阅读,人们建议尝试使用信任代理和 secureProxy,这已经完成但仍然没有成功。
原来我是白痴,应该是这样的:
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));
};
现在一切正常:)
我在使用 express-session 时遇到了类似的问题,经过多次试验,我的罪魁祸首是设置 cookie.domain。浏览器不会保存 cookie。
这是我设置值的方式:
cookie: {
...
domain: process.env.OPENSHIFT_CLOUD_DOMAIN,
...
}
希望它能帮助任何遇到同样问题的人,因为当时这是最适合分享这个的 Whosebug 问题。