2012-01-22 2 views
4

В настоящее время я разрабатываю приложение facebook, в котором пользователь должен будет войти в систему до того, как сможет получить доступ к приложению.Redirect loop with Rails & Omniauth on before_filter

У меня есть 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,
Руби 1.9.3,
OmniAuth-facebook 1.2.0,
OmniAuth 1.0.2

+0

Hrm, 'before_Filter' - Я сейчас замечаю орфографическую ошибку. Это так же просто, как исправить вашу орфографическую ошибку? Или этот код был перепечатан, а не скопирован и вставлен? (Пожалуйста, не перепечатывайте.) – sarnold

ответ

5

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

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

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

+0

Спасибо за ваш ответ Брэдли, я дал вам предложение пойти и не идти на смену контроллера сессии. Что касается вашего другого предложения, это то, что контроллер встроен в omniauth? Если это так, я просто переопределяю его локально или поддерживает omniauth систему декоратора –

+0

Что вы делаете после FB, у вас есть Session # create, если это так, попробуйте 'skip_before_filter: check_sign_in,: only => [: new,: create] ' –

+0

Ах, вот и все! Большое спасибо. –

Смежные вопросы