为什么Devise + Omniauth回调没有击中正确的控制器?

时间:2012-05-03 14:39:43

标签: ruby-on-rails devise omniauth

任何人都可以帮我解决这个问题吗?

我在Rails 3.2应用程序中使用Devise + Omniauth。我想知道的是,使用Devise的user_omniauth_authorize_path(provider)方法在幕后发生了什么。

我已经通过rake路线和宝石的来源进行了挖掘,但是我看不到任何明显会导致我遇到的问题。

我认为这种方法只是调用提供者的登录URL(例如Twitter),然后返回到routes.rb中定义的回调路径。

在我的routes.rb中我有

devise_for :users, :controllers => { :omniauth_callbacks => 'users/omniauth_callbacks'}

devise_scope :user do
    get '/users/auth/:provider' => 'users/omniauth_callbacks#passthru'
end

在users / omniauth_callbacks_controller.rb中我有

def twitter
    render :text => "This works" 
end

def passthru
    render :text => "This doesn't work"
end

在视图中我有<%= link_to "Twitter", user_omniauth_authorize_path(:twitter) %>。点击此链接转到我可以登录的Twitter,但在返回我的应用程序后,我收到错误“您已登录”。

我无法弄清楚如何或为什么会产生此错误。我应该只看到“这个有效”或“这不起作用”。

我也有一个Facebook提供商以完全相同的方式设置,这可以按预期工作。

如果我用<a href="/users/auth/twitter">Twitter</a>替换Devise的omniauth链接,那么我会得到“This works”。

所以这解决了我的问题,但它并不理想,我想知道原因。

任何人都可以放弃任何光明吗?

修改

Rake路线如下所示:

user_omniauth_callback        /users/auth/:action/callback(.:format)                       users/omniauth_callbacks#(?-mix:twitter|facebook)

1 个答案:

答案 0 :(得分:1)

嗯,它对我有用,所以它绝对是你的最终目的。首先,您是否在控制台中比较了通过2种不同方法获得的GET调用/users/auth/twitter/users/auth/twitter?callback?它们应该看起来完全一样(当然除了令牌和验证器之外)。

现在,我不确定这是否相关,但是如果您没有使用passthru路线,那么您可以删除该路线。相反,在回调控制器中,您应该实现一个名为failure的操作来处理错误的请求。 See here用于设计的实施。

我在这里抓住了吸管,但你应该在你的回调控制器结束时使用它:

# This is necessary since Rails 3.0.4
# See https://github.com/intridea/omniauth/issues/185
# and http://www.arailsdemo.com/posts/44
protected
def handle_unverified_request
  true
end