Ruby on rails 3 Omniauth Facebook手动轨道路线

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

我正在尝试在Rails 3应用程序中使用Omniauth facebook和两个Desive模型。目前,使用omniauthable和Desive助手不可能做到这一点

类似的问题回答了如何做到这一点:

“。将您的omniauth配置从designe.rb移动到omniauth.rb,并创建您自己的omniauth路由。”

但我在定义这些路线和助手时遇到了困难,例如,对于facebook,我使用了如下Desive助手:

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',
      }