Цикл перенаправления с Rails & Omniauth на before_filter - PullRequest
4 голосов
/ 23 января 2012

В настоящее время я занимаюсь разработкой приложения для Facebook, для которого пользователю необходимо войти в систему, прежде чем он сможет получить доступ к приложению.

У меня есть before_filter на application_controller, чтобы проверить, если пользовательвошел в систему, и если не перенаправить их на правильный знак в пути.

Это код на данный момент:

Application Controller

before_filter :check_sign_in

def check_sign_in
  unless user_signed_in?
  redirect_to signin_path
end

private 
def current_user
  begin
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  rescue Mongoid::Errors::DocumentNotFound
    nil
  end
end

def user_signed_in?
  return true if current_user
end

У меня есть routes.rb У меня есть следующее для signin_path

match '/signin' => 'sessions#new', :as => :signin

Мое sessions#new действие выглядит следующим образом

def new
  redirect_to '/auth/facebook'
end

Проблема, однако, заключается в том, что с этим я получаю ошибку цикла перенаправления, которая выглядит следующим образом

Эта веб-страница имеет цикл перенаправления
Веб-страница http://localhost:3000/signin вызвала слишком много перенаправлений.Очистка файлов cookie для этого сайта или разрешение сторонних файлов cookie может решить проблему.Если нет, то это, возможно, проблема с конфигурацией сервера, а не проблема с вашим компьютером.

Вероятно, это более чем вероятно, потому что вход в Facebook также имеет обратный вызов, который я подозреваю, чтовызывая петлю.Есть ли лучший подход, чтобы убедиться, что пользователь вошел в систему или другой способ добиться того, что я имел в виду?

В настоящее время я использую Rails 3.1.3,
Ruby 1.9.3,
omniauth-facebook 1.2.0,
omniauth 1.0.2

1 Ответ

5 голосов
/ 23 января 2012

В вашем SessionsController вам нужно добавить skip_before_filter :check_sign_in, :only => [:new, :create].

Добавление before_filter в ApplicationController без условий означает, что каждое отдельное действие в каждом контроллере, которое наследуется от него, также будет перенаправлено, поэтому фактическое действие сеансов никогда не будет вызываться.

Возможно, вам также придется пропустить before_filter в вашем OmniAuthCallbackController в зависимости от того, наследует ли он также от ApplicationController.

...