как мне сделать так, чтобы все пути Devise использовали https? - PullRequest
7 голосов
/ 02 марта 2012

Похожие: Rails 3 маршрутизация SSL перенаправляет с https на http (к сожалению, не работает).

Дублируйте, но у меня не получился ответ: Настройка ssl на устройстве

У меня есть веб-приложение, которое уже давно работает нормально, но мне нужно добавить 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

Я получил это, чтобы работать достаточно хорошо, но когда я выхожу, я получаю 301 из действия DELETE сессий, которое отправляет меня в 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 ]

10 голосов
/ 08 марта 2012

Ответов пока нет, вот что я пришел к выводу:

  1. Когда вы заходите на сайт через https, не заходите на него через http, пока пользователь не выйдет из системы (атака с помощью firesheep). В статье, приведенной выше, есть много материала о Devise, в котором обсуждается только наличие https на странице входа / выхода. Плохая идея.

  2. Все, что вам действительно нужно, это:

    #in config/environments/production.rb
    config.to_prepare { Devise::SessionsController.force_ssl }
    config.to_prepare { Devise::RegistrationsController.force_ssl }
    
  3. У меня было множество проблем, связанных с 'after_sign_in_path' от Devise. Оказывается, after_sign_out_path_for ожидает возврата пути - это не событие, а вопрос, куда должен быть направлен пользователь. Поэтому я вернулся root_path :protocol => 'http://', и об этом позаботились.

3 голосов
/ 06 мая 2013

Убедитесь, что вы используете https во всех своих ссылках Devise (это позволяет избежать перенаправления force_ssl).

В вашем rout.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. Переписывание force_ssl с HTTP DELETE на HTTPS GET исключено. Все работает :) 1009 *

2 голосов
/ 05 мая 2012

Попробуйте заставить все ваше приложение использовать HTTPS, добавив:

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

У меня была такая же проблема.Иногда я выписываюсь нормально, иногда я получаю 301 от действия DELETE и перенаправляю на GET.Для меня это было проблемой.

...