1

Rails3アプリで2つのデバイスモデルでOmniauthfacebookを使用しようとしています。現在、これは、omniauthableとdeviseヘルパーを使用して可能なことではありません。

同様の質問がこれを行う方法に答えました:

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.find_for_facebook_oauth(request.env["omniauth.auth"], current_user, params[:state])

..パーツは準備ができていますが、現在は2つのモデルがあります。私が思うデバイスヘルパーの交換に問題があります。

4

1 に答える 1

2

あなたのリンクはこれに見えるはずです:

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

また、いくつかのコールバックルートを作成する必要があり、これを行うには2つの方法があります。次のいずれかを実行できます。

  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-oauth2しかし、 gemを使用してGoogle+を使用してサインインしている場合はどうなりますか?あなたの唯一の望みは、各omniauth gem(ここにリストされている)にいくつかの優れたドキュメントがあることです。

いずれにせよ、使用するURLがわからない場合や、特定の宝石で使用されているURLが気に入らない場合は、いつでも変更できます。

たとえば、/auth/google_oauth2少なくともfacebookやtwitterのURLと比較すると、URLは確かにきれいではありません。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',
  }

/auth/googleこれで、URLをより適切に使用できるようになりました。

注:私はいくつかの言及をしましたAuthenticationsControllerが、おそらくあなたが持っているものはまたはであり、あなたがそれを何と呼ぶか​​は実際には重要ではありませんCallbacksControllerOmniauthCallbacksController

于 2012-12-11T01:01:52.043 に答える