用于rails应用程序的安全会话cookie

时间:2013-03-07 02:05:45

标签: ruby-on-rails-3 https devise session-cookies

我在session_store.rb中有以下配置

Fuel::Application.config.session_store :cookie_store,
  :key => "_secure_session",
  :secure => !(Rails.env.development? || Rails.env.test?),
  :domain => :all

在application_controller.rb

def default_url_options
  return { :only_path => false, :port => 443, :protocol => 'https' }
end

我正在使用devise,我的rails3服务器正在HAProxy后面运行。 HAProxy终止HTTPS流量并将HTTP请求传递给Rails。我的问题是当我打开时:secure =>如果在session_store.rb中为true,则会将用户重定向回登录页面,并显示消息“Unauthorized”。我已经尝试过调试它,不知道如何让它正常工作。

这种情况下,HAProxy是反向代理,终止所有安全流量并将非安全流量传递给rails。当rails将cookie设置为安全时,它本身就无法访问它。

2 个答案:

答案 0 :(得分:7)

对于您的正常会话cookie,您正确执行此操作。您应该在浏览器中看到'_secure_session'cookie正确设置为安全。对于Devise“记住我”cookie,您需要在设计配置中设置它。在config / initializers / devise.rb中,你会在第133行的某个地方找到一条看起来像

的行
# Options to be passed to the created cookie. For instance, you can set
# :secure => true in order to force SSL only cookies.
# config.cookie_options = {}

我把它改为:

config.rememberable_options = {:secure => Rails.env.production?}

答案 1 :(得分:1)

如果在初始身份验证时没有将Set-cookie发送到浏览器,那么这听起来像是一个设计问题。

如果Set-cookie要访问浏览器,但未在下一个https://请求中发回,那么它可能与以下内容不匹配:secure =>设置。

如果cookie是由浏览器发送的,但HAProxy没有传递,那么这是一个HAProxy配置问题。

如果cookie位于ruby环境中,并且由于策略而被忽略,那么在Ruby代码中某处出现问题 - 猜测,围绕安全/不安全的cookie匹配。