使用Rails和amp;重定向循环Omniuth on before_filter

时间:2012-01-22 23:58:13

标签: ruby-on-rails ruby-on-rails-3 facebook omniauth

我目前正在开发一款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,
omn​​iauth-facebook 1.2.0,
omn​​iauth 1.0.2

1 个答案:

答案 0 :(得分:5)

在SessionsController中,您需要添加skip_before_filter :check_sign_in, :only => [:new, :create]

在没有条件的情况下在ApplicationController中添加before_filter意味着每个从它继承的控制器中的每个操作也将被重定向,因此永远不会调用实际的会话操作。

您可能还需要跳过OmniAuthCallbackController中的before_filter,具体取决于它是否也从ApplicationController继承。