1

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

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

Omniauth “与” STI 并设计

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

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

user_omniauth_authorize_path(:facebook) 

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

如果手动设置,对于omniauth-facebook 策略,我的路线/助手会是什么样子?

我已经拥有了omniauth-facebook,并且之前为“用户”模型设计了很好的工作,所以我有各种各样的

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

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

4

1 回答 1

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 操作中,您可以获取用户的帖子。

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

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

但是,如果您使用omniauth-google-oauth2gem 通过 Google+ 登录怎么办?您唯一的希望是每个omniauth gem(在此处列出)都有一些好的文档。

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

例如,网址/auth/google_oauth2肯定不漂亮,至少与 facebook 和 twitter 的网址相比。要更改 url,请使用该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',
  }

现在你可以使用 url/auth/google了,好多了。

注意:我多次提到了 anAuthenticationsController但也许你所拥有的是 aCallbacksController或 anOmniauthCallbacksController,你怎么称呼它并不重要。

于 2012-12-11T01:01:52.043 回答