6

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

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

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

我假设此方法只是调用提供者的登录 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 提供程序,并且按预期工作。

如果我将 Devise 的omniauth 链接替换为<a href="/users/auth/twitter">Twitter</a>“This works”。

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

任何人都可以解释一下吗?

编辑

耙路线看起来像这样:

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

1 回答 1

1

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

现在,我不确定这是否相关,但是通过设计,您不使用直通路线,因此您可以删除该路线。相反,在您的回调控制器中,您应该实现一个名为 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
于 2012-05-05T02:10:39.357 回答