任何人都可以帮我解决这个问题吗?
我在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)
答案 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