【问题标题】:Redirect loop with Rails & Omniauth on before_filter在 before_filter 上使用 Rails 和 Omniauth 重定向循环
【发布时间】:2012-01-22 23:58:12
【问题描述】:

我目前正在开发一个 facebook 应用程序,该应用程序需要用户登录才能访问该应用程序。

我在application_controller 上有一个before_filter 来检查用户是否已登录,如果没有将他们重定向到正确的登录路径。

这是目前为止的代码:

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 的过程也有一个回调,我怀疑这是导致循环的原因。是否有更好的方法来确保用户被登录或其他方法来实现我的想法?

我目前正在使用 导轨 3.1.3,
红宝石 1.9.3,
omn​​iauth-facebook 1.2.0,
全域认证 1.0.2

【问题讨论】:

  • Hrm, before_Filter -- 我现在才注意到拼写错误。是否像修复拼写错误一样简单?或者这段代码是重新输入的而不是复制粘贴的? (请不要重新输入。)

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


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回答布拉德利,我给了您的建议,但不要继续更改会话控制器。至于你的其他建议,是omniauth内置的控制器吗?如果是这样,我应该在本地覆盖它还是omniauth支持装饰器系统
  • FB之后你在做什么,有没有Sessions#create,有的话试试skip_before_filter :check_sign_in, :only => [:new, :create]
  • 啊,就是这样!非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-23
相关资源
最近更新 更多