繁体   English   中英

如何使用Rails通过HTTP强制使用安全cookie

[英]How to force a secure cookie over HTTP with Rails

我正在使用位于反向代理服务器(Nginx)后的Rails应用程序,并且需要将Rails应用程序的会话cookie标记为Secure 但是,当我将其设置如下

Application.config.session_store :cookie_store, :key => '_app_session', :secure => true

Rails停止发送_app_session cookie。

我知道Rails会阻止它,因为我直接用curl -v击中了Rails,并且当我忽略:secure => true时,我可以看到_app_session cookie。

如何强制Rails通过HTTP连接发送安全cookie?

注意:在这种特定情况下,可以通过HTTP发送安全cookie。 在被封装为SSL并发送到世界之前,这种流量发生在一个被认为安全的区域。 此外,“ 在上游终止SSL相当普遍 ”,因此我不是第一个拥有这种设置的人。

替代方法(什么不起作用)

这是我已经尝试过的方法:

我在Lua中编写了一个脚本,将Secure添加到cookie。 它奏效了,但是我的老板说我们不能在Nginx中使用Lua。

我不知道如何在Nginx中使用以下指令来实现所需的功能:

  • $ http_header
  • proxy_set_header
  • more_set_headers
  • $ cookie_COOKIE

我尝试按照此处的建议添加set_proxy_headeradd_header ,但是它没有用,并且我怀疑我们的设置可能会导致某些add_header

最后,假设我可以为Nginx编写一个C模块,但是我不会这样做。

我在Nginx conf文件的相关location块中添加了以下内容:

proxy_set_header X-Forwarded-Proto https;

以前没有用,因为我在问题链接的建议中使用了X-Forwarded-Proto $scheme 我不知道为什么那没用,但是

$ curl -v -H "X-Forwarded-Proto: https" http://localhost:95/app-path

确实会返回预期的_app_session cookie,并设置了Secure标志,因此显然RoR只需要知道安全cookie最终将通过https发出。

更新(2015年6月)

之所以遇到这个问题,是因为我们的服务器代理将http请求传递给自己以获取https而不是先设置X-Forwarded-Proto 一旦更好地了解了我们的拓扑,就可以在第一次通过代理之前执行X-Forwarded-Proto $scheme 那是正确的解决方案。

您应该看一下rack-ssl-enforcer gem。 从导轨上消除了问题,并且可以根据您的需求进行高度配置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM