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

And*_*vey 6 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
Run Code Online (Sandbox Code Playgroud)

在users/omniauth_callbacks_controller.rb我有

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

def passthru
    render :text => "This doesn't work"
end
Run Code Online (Sandbox Code Playgroud)

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

我无法弄清楚如何或为什么生成此错误.我应该只看到"这个有效"或"这不起作用".

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

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

所以这解决了我的问题,但它并不理想,我想知道为什么.

谁能摆脱任何光明?

编辑

Rake路线如下所示:

user_omniauth_callback        /users/auth/:action/callback(.:format)                       users/omniauth_callbacks#(?-mix:twitter|facebook)
Run Code Online (Sandbox Code Playgroud)

Ash*_*aka 1

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

现在,我不确定这是否相关,但是使用 devise,您不使用通路路由,因此您可以删除该路由。相反,在回调控制器中,您应该实现一个名为 failure 的操作来处理错误的请求。请参阅此处了解设备的实现。

我在这里抓住了救命稻草,但你也应该在你的回调控制器的末尾有这个:

# 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
Run Code Online (Sandbox Code Playgroud)