我应该如何使所有Devise路径使用https?

时间:2012-03-02 02:26:18

标签: ssl ruby-on-rails-3.1 devise

相关:Rails 3 SSL routing redirects from https to http(遗憾的是没有用)。

重复,但答案对我不起作用:setting up ssl on devise

我有一个网络应用程序,现在已经工作了一段时间,但我需要将SSL添加到登录/编辑acct路径。我正在使用Devise进行身份验证。我在设计维基中找到了一个条目,使得这个过程看起来很简单,但该死的,如果我可以让它工作的话。简单的部分是:

#in config/environments/production.rb
config.to_prepare { Devise::SessionsController.force_ssl }
config.to_prepare { Devise::RegistrationsController.force_ssl }

然后在这个要点中有大约25行代码:https://gist.github.com/1040964

我得到了足够好的工作,但是当我退出时,我从会话DELETE操作中获得了301,这使我获得了GET。

Started DELETE "/users/sign_out" for 98.246.164.160 at 2012-03-02 01:45:42 +0000
[02 Mar 01:45 10886   INFO]   Processing by Devise::SessionsController#destroy as HTML
[02 Mar 01:45 10886   INFO]   Parameters: {"authenticity_token"=>"fI4VZ4V0Go2Civo3sJz8Dv5/Wtaa90ynaYr+xxx="}
[02 Mar 01:45 10886  DEBUG] Parameters: {"_method"=>"delete", "authenticity_token"=>"fI4VZ4V0Go2Civo3sJz8Dv5/Wtaa90ynaYr+xxxx=", "action"=>"destroy", "controller"=>"devise/sessions"}
[02 Mar 01:45 10886   INFO] Redirected to https://ec2-xx-xx-106-255.us-west-2.compute.amazonaws.com/users/sign_out
[02 Mar 01:45 10886   INFO] Completed 301 Moved Permanently in 3ms

Started GET "/users/sign_out" for xx.xx.164.160 at 2012-03-02 01:45:42 +0000
[02 Mar 01:45 10886  FATAL] 
ActionController::RoutingError (No route matches [GET] "/users/sign_out"):

所以我想我需要从头开始。使任何Devise路径使用https的最简单方法是什么,但我的应用程序中的其余路径使用http?我试过这个(从顶部的SO帖子):

 #devise routes
  scope :protocol => 'https://', :constraints => { :protocol => 'https://' } do
    devise_for :users, :controllers => { :registrations => :registrations }
    devise_for :admins
  end

但是没有去。我需要一个更好的建议。

3 个答案:

答案 0 :(得分:10)

还没有答案,所以这就是我的结论:

  1. 通过https访问某个网站后,请不要通过http访问该网站,直到用户退出(firesheep attack)。在上面链接的文章中,Devise上有很多内容,只讨论登录/退出页面上的https。馊主意。

  2. 你真正需要的是:

    #in config/environments/production.rb
    config.to_prepare { Devise::SessionsController.force_ssl }
    config.to_prepare { Devise::RegistrationsController.force_ssl }
    
  3. 我在Devise中遇到了很多关于'after_sign_in_path'的问题。事实证明after_sign_out_path_for期望返回一个路径 - 它不是一个事件,而是询问用户应该被定向到哪里。所以我退回了root_path :protocol => 'http://',并负责处理它。

答案 1 :(得分:3)

确保在所有Devise链接中使用https(这样可以避免使用force_ssl重定向)。

在routes.rb中(仅在生产环境中应用):

scope defaults: (Rails.env.production? ? { protocol: 'https' } : {}) do
  devise_for :users
end

现在在您的应用程序中使用:

destroy_user_session_url # use _url instead of _path so the protocol is added!

现在,您的退出/退出链接(以及其他设计链接)将直接指向https。从HTTP DELETE到HTTPS GET的force_ssl重写被避免。一切正常:)

答案 2 :(得分:2)

尝试通过添加以下内容使整个应用使用HTTPS:

#in config/environments/production.rb
config.force_ssl = true

我遇到了同样的问题。有时我签好了有时我从DELETE操作得到301并重定向到GET。对我来说这就是问题所在。