Omniauth Facebook手册Rails路线

时间:2012-12-09 21:12:10

标签: ruby-on-rails-3 devise omniauth

我正在尝试在Rails 3应用程序中使用Omniauth facebook和两个设计模型。目前,使用omniauthable和设计助手不是可能的。

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

Omniauth "with" STI and devise

“..将你的omniauth配置从devise.rb移动到omniauth.rb并创建你自己的omniauth路由。'

但是我在定义这些路线和助手方面遇到了麻烦,即对于facebook我使用了这样的设计助手:

user_omniauth_authorize_path(:facebook) 

..重定向到facebook,然后放置我在devise_for范围内设置的回调URL。

如果手动设置,我的路线/助手会对omniauth-facebook策略有什么看法?

我之前已经有了omniauth-facebook并为'User'模型设计了很好的工作,所以我有各种各样的

@user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user, params[:state])

..零件准备好了,但现在有两个型号。我只是在替换我认为的设计助手时遇到了麻烦。

1 个答案:

答案 0 :(得分:2)

您的链接应该是这样的:

<%= link_to "Sign in with Facebook", "/auth/facebook" %>

您还必须创建一些回调路由,并且有两种方法可以执行此操作。你可以:

  1. 定义捕获所有回调并重定向到单个控制器操作的路由:

    get "/auth/:provider/callback" => "authentications#create"
    

    然后,您可以使用params[:provider]获取提供商的名称。使用if,您可以根据提供商的不同做一些事情。

  2. 或者为每个提供商定义路径,您可以在其中指向控制器中的不同操作:

    get "/auth/twitter/callback" => "authentications#twitter"
    get "/auth/facebook/callback" => "authentications#facebook"
    

    这些路线也可以在一条路线中压缩:

    get "/auth/:action/callback",
      :to => "authentications",
      :constraints => { :action => /twitter|facebook/ }
    

    然后您需要定义这些操作。例如,在Twitter操作中,您可以获取用户的推文,在Facebook操作中,您可以获取用户的帖子。

  3. 另外,不要忘记创建failure操作来处理用户未授权使用某个提供程序登录的情况。

    现在,你会遇到一个问题。你如何找到链接指向的位置?对于Twitter和Facebook,它似乎非常明显(分别为/auth/twitter/auth/facebook)。

    但是,如果您使用Google+ omniauth-google-oauth2 gem登录,该怎么办?你唯一的希望是每个omniauth gem(listed here)都有一些很好的文档。

    在任何情况下,如果您不知道您应该使用的网址,或者您只是不喜欢某个宝石使用的网址,您可以随时更改它!

    例如,网址/auth/google_oauth2肯定不漂亮,至少与facebook和twitter的网址相比。要更改网址,请使用name选项。

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

    现在您可以更好地使用网址/auth/google

    注意:我对AuthenticationsController进行了多次引用,但也许您所拥有的是CallbacksControllerOmniauthCallbacksController,这并不重要你叫它。