Ruby on rails 3 Omniauth Facebook手动轨道路线
我正在尝试在Rails 3应用程序中使用Omniauth facebook和两个Desive模型。目前,使用omniauthable和Desive助手不可能做到这一点 类似的问题回答了如何做到这一点: “。将您的omniauth配置从designe.rb移动到omniauth.rb,并创建您自己的omniauth路由。” 但我在定义这些路线和助手时遇到了困难,例如,对于facebook,我使用了如下Desive助手:Ruby on rails 3 Omniauth Facebook手动轨道路线,ruby-on-rails-3,devise,omniauth,Ruby On Rails 3,Devise,Omniauth,我正在尝试在Rails 3应用程序中使用Omniauth facebook和两个Desive模型。目前,使用omniauthable和Desive助手不可能做到这一点 类似的问题回答了如何做到这一点: “。将您的omniauth配置从designe.rb移动到omniauth.rb,并创建您自己的omniauth路由。” 但我在定义这些路线和助手时遇到了困难,例如,对于facebook,我使用了如下Desive助手: user_omniauth_authorize_path(:facebook
user_omniauth_authorize_path(:facebook)
…它重定向到facebook,然后在我的Desive_中为scope设置了一个回调URL
如果手动设置,omniauth facebook策略的我的路线/助手会是什么样子?
我之前已经有了omniauth facebook,并且设计出了一个很好的“用户”模型,所以我有各种
@user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user, params[:state])
…零件准备就绪,但现在有两种型号。我想我只是在更换Desive助手时遇到了问题。您的链接应该如下所示:
<%= link_to "Sign in with Facebook", "/auth/facebook" %>
然后,您可以使用params[:provider]
获取提供程序的名称。然后,使用if
可以根据提供程序执行不同的操作
get "/auth/twitter/callback" => "authentications#twitter"
get "/auth/facebook/callback" => "authentications#facebook"
这些路由也可以压缩到单个路由中:
get "/auth/:action/callback",
:to => "authentications",
:constraints => { :action => /twitter|facebook/ }
然后,您需要定义这些操作。例如,在twitter操作中,您可以获取用户的推文,在facebook操作中,您可以获取用户的帖子失败
操作,以处理用户未授权登录特定提供商的情况
现在,您将遇到一个问题。如何找到链接应该指向的位置?对于Twitter和Facebook,这似乎非常明显(/auth/Twitter
和/auth/Facebook
)
但是如果您使用omniauth-google-oauth2
gem使用google+登录会怎么样?您唯一的希望是每个omniauth gem()都有一些好的文档
在任何情况下,如果你不知道你应该使用的url,或者如果你只是不喜欢某个gem使用的url,你可以随时更改它
例如,url/auth/google_oauth2
肯定不漂亮,至少与facebook和twitter的url相比是这样。要更改url,请使用名称
选项
# omniauth.rb, when using pure omniauth
provider :google_oauth2, ENV['GOOGLE_KEY'], ENV['GOOGLE_SECRET'],
{
name: 'google'
}
# devise.rb, when using omniauth+devise
config.omniauth :google_oauth2, ENV['GOOGLE_KEY'], ENV['GOOGLE_SECRET'],
{
name: 'google',
}
现在您可以使用url/auth/google
,这会更好
注意:我多次提到了
身份验证控制器
,但可能您拥有的是CallbackController
或OmniAuthCallbackController
,您如何称呼它并不重要。谢谢Ashitaka的帮助。我在我的路线中添加了以下内容,并包括/auth/fac>电子书作为“登录”链接。它现在似乎工作正常。设计\u范围:用户进行匹配/auth/facebook/callback”=>“用户/omniauth\u回调”#facebook“匹配”/“注销”=>“会话”#“,:as=>:signout match'/auth/failure'=>'sessions#destroy'endBefore在omniauth设计路由之前,我有一个get'/users/auth/:provider'=>'users/omniauth#u回调#passthru'设置。但现在我把它指向用户/omniauth#U回调#facebook-这样可以吗?不,你不需要这条路线。另外,我认为您应该将'/auth/failure'
路由指向users/omniauth\u回调#failure
。在failure
操作中,您将定义当用户不想登录Facebook时希望发生的事情。是否将用户重定向到根页面?也许是另一页?
# omniauth.rb, when using pure omniauth
provider :google_oauth2, ENV['GOOGLE_KEY'], ENV['GOOGLE_SECRET'],
{
name: 'google'
}
# devise.rb, when using omniauth+devise
config.omniauth :google_oauth2, ENV['GOOGLE_KEY'], ENV['GOOGLE_SECRET'],
{
name: 'google',
}