Как я могу исправить цикл перенаправления при использовании Devise с SSL на промежуточном сервере? - PullRequest
0 голосов
/ 01 марта 2012

Я установил самоподписанный сертификат на моем промежуточном сервере.Я использую это, чтобы проверить мои настройки ssl.Я использую Devise 1.5 для входа в систему и следую этой статье на вики devise для конфигурации ssl / http .

В документах говорится:

И обязательно включите SSL на сервере (Nginx, Apache и т. Д.).Если серверы не настроены должным образом, Rails не распознает запрос как SSL (даже если он есть) и вызовет бесконечный цикл перенаправления.

Хорошо, это похоже на то, что происходит, но яСильно подозреваю, что мне не нужно «переключать коммутатор» по SSL (это экземпляр EngineYard).У меня установлен сертификат SSL на сервере.

Я проверил файл /etc/nginx/servers/MyAppName.ssl.conf, и он имеет следующие строки:

  ssl on;
  ssl_certificate /etc/nginx/ssl/MyAppName.crt;
  ssl_certificate_key /etc/nginx/ssl/MyAppName.key;
  ssl_prefer_server_ciphers on;
  ssl_protocols  SSLv3 TLSv1;

Так что выглядит ... верно?Я не хочу связываться с этим, это точно.

Мой RegistrationsController имеет force_ssl :only => [:new, :create, :edit, :update], поэтому все действия по аутентификации должны вызывать ssl, насколько я могу судить.SessionsController имеет force_ssl :only => [:new, :create].

Я понимаю, что здесь много движущихся частей, но на что мне смотреть дальше?

Вот бревна рельсов:

Started GET "/users/sign_in" for 98.246.164.160 at 2012-02-29 20:47:39 +0000
[29 Feb 20:47 23166   INFO]   Processing by Devise::SessionsController#new as HTML
[29 Feb 20:47 23166  DEBUG] Parameters: {"action"=>"new", "controller"=>"devise/sessions"}
[29 Feb 20:47 23166   INFO] Redirected to https://ec2-xxx-xxx-106-255.us-west-2.compute.amazonaws.com/users/sign_in
[29 Feb 20:47 23166   INFO] Completed 301 Moved Permanently in 1ms
[29 Feb 20:47 23166   INFO] 

Started GET "/users/sign_in" for 98.246.164.160 at 2012-02-29 20:47:39 +0000
[29 Feb 20:47 23166   INFO]   Processing by Devise::SessionsController#new as HTML
[29 Feb 20:47 23166  DEBUG] Parameters: {"action"=>"new", "controller"=>"devise/sessions"}
[29 Feb 20:47 23166   INFO] Redirected to http://ec2-xxx-xxx-106-255.us-west-2.compute.amazonaws.com/users/sign_in
[29 Feb 20:47 23166   INFO] Completed 302 Found in 1ms
[29 Feb 20:47 23166   INFO] 

Started GET "/users/sign_in" for 98.246.164.160 at 2012-02-29 20:47:39 +0000
[29 Feb 20:47 23166   INFO]   Processing by Devise::SessionsController#new as HTML
[29 Feb 20:47 23166  DEBUG] Parameters: {"action"=>"new", "controller"=>"devise/sessions"}
[29 Feb 20:47 23166   INFO] Redirected to https://ec2-xxx-xxx-106-255.us-west-2.compute.amazonaws.com/users/sign_in
[29 Feb 20:47 23166   INFO] Completed 301 Moved Permanently in 1ms

Ответы [ 2 ]

1 голос
/ 11 июля 2012

Для тех из вас, кто приехал сюда через Google, позвольте мне опубликовать еще одну возможную причину этой проблемы, которая просто потратила мой день, надеюсь, она не потратит впустую ваш.

Если вы используете Passenger в рабочей среде и настраиваете его с VirtualHost в Apache (например, в conf / httpd.conf), но НЕ настраиваете его в conf.d / ssl.conf, вы можете получить проблема зацикливания Симптом, который возникнет у вас, если эта неправильная конфигурация вызовет вашу проблему, будет состоять в том, что request.ssl? всегда будет ложным, даже если вы явно вводите https в своем запросе. Чтобы проверить свой симптом, вы можете поместить обработчик отладки before_filter в application_controller.rb с чем-то вроде:

class ApplicationController < ActionController::Base
before_filter :check_ssl

  def check_ssl
    logger.info("==== ssl: #{request.ssl? }")
  end

end

Если он всегда регистрирует ==== ssl: false, даже когда вы отправляете запрос https://whatever, то проблема может быть в конфигурации VirtualHost. Если вы поместите директивы DocumentRoot и Directory для вашего приложения rails в VirtualHost в файле conf.d / ssl.conf, это решит проблему. По крайней мере, для меня.

0 голосов
/ 02 марта 2012

Решение этой проблемы заключалось в методе'ure_proper_protocol 'из сущности.Я переименовал его, чтобы сделать его более читабельным, и он выглядит так:

def ssl_forced_action?
    (params[:controller] == 'devise/sessions' && ['new', 'create'].include?(params[:action])) ||
        (params[:controller] == 'devise/registrations' && ['new', 'create', 'edit', 'update'].include?(params[:action])) ||
        (params[:controller] == 'users/omniauth_callbacks')
  end

Обратите внимание, что оригинал использовал users/sessions.

...