2016-03-10 14 views
6

私は、Rails 4アプリでOmniauthでDevise 3.5を使用しています。私は、ユーザーが自分のFacebookアカウントを自分のアプリケーションに接続できるFacebookとの統合を作成しました。現在、ユーザーが[接続]ボタンをクリックすると、/user/auth/facebookに送信され、Omniauthが生成するコールバックURL:/user/auth/facebook/callbackにリダイレクトされます。私がしたいのは、場合によってはこのコールバックURLを手動でオーバーライドすることです。つまり、イニシャライザでオーバーライドしたくないという意味です。完全修飾URLです。たとえば、ユーザーがhttp://www.example.com/を開始した場合、デフォルトのコールバックURLをhttp://app.example.com/user/auth/facebook/callbackで上書きすることができます。Devise/OmniAuthデフォルトのコールバックURLを無効にする

私のアプリにはダイナミックサブドメインがあり、ユーザーは(ほぼ)常にサブドメインで認証プロセスを開始します。残念ながら、FacebookはoauthリダイレクトURLでワイルドカードをサポートしていないように見えます。なぜなら、ユーザーがサブドメインにいるかどうかを検出し、Facebookアプリでホワイトリストに登録したコールバックURLを調整する必要があるからですプロセスは成功する。

私が読んだことから、URLヘルパーomniauth_authorize_pathはパラメータとして渡される追加の引数を受け入れます。私は成功せず、そのようにカスタムコールバックパスを渡して試してみた:

user_omniauth_authorize_path(:facebook, callback_path: @custom_callback) 

私もredirect_urlredirect_uricallback_pathを変更しようとしましたが、何も動作していないようにみえます。生成されたリンクを見ると、実際にはURLのパラメータとしてコールバックが含まれますが、リンクをクリックすると、カスタムコールバックURLの代わりにデフォルトのコールバックURLにリダイレクトされます。

+0

私はこの機能も必要です:( – diogopms

答えて

0

は、ここで私は、この問題を解決する方法です。私はよ他の方法もありますが、これは私が思いつく最も簡単な最も洗練されたソリューションのようです。

config/routes.rbauthサブドメインを設定しました。すべてのOauth接続要求が別のサブドメインから開始され、Facebookがセットアップされます。それらのユーザーをtに戻す彼auth.example.comサブドメイン。

constraints AuthRedirect do 
    devise_scope :contact do 
     get '/auth/facebook/callback' => 'omniauth_callbacks#facebook' 
     post '/auth/facebook/callback' => 'omniauth_callbacks#facebook' 
    end 
end 

ここは/lib/auth_redirect.rbです。これは、サブドメインがauthであるかどうかをチェックし、そのトラフィックをキャプチャします。これは、他のサブドメインよりも優先されるように、ルートリストの一番上に配置されます。ユーザーがConnect with Facebookボタンをクリックしたときに

class AuthRedirect 
    def self.matches?(request) 
     request.subdomain.present? && request.subdomain == 'auth' 
    end 
end 

はその後、私のクライアントには、私は/auth/facebook?contact_id=<id>に送信します。ここからDeviseはそれらをFacebookに誘導してからhttps://auth.example.com/にリダイレクトします。

はその後OmniauthCallbacksController#facebookに私はそうのようなomniauthのparamsからユーザーのIDを引くことができます。

auth = env["omniauth.auth"] 
contact = Contact.find(env['omniauth.params']['contact_id']) 

ここからは、私はデータベースへの資格情報を保持し、戻って適切なサブドメインにユーザーをリダイレクトすることができます。このソリューションはCSRFトークンの問題を回避し、さらに重要なことに、私がRuby/ERBを使用して、ユーザーが接続ボタンをクリックしたときに送信されるオムニパス認可パスを構築する必要はありません。

1

redirect_uriで試してみましたか?

user_omniauth_authorize_path(:facebook, redirect_uri: @custom_callback) 

EDIT:申し訳ありませんあなたの投稿の2番目の部分を逃しました。

私は実際にプロダクションで同じ問題を抱えていますが、ステージング環境では完全に機能します。私は「

config.oaumniauth :facebook, ..., callback_url: 'url right here' 

:唯一の違いは、あなたが工夫の初期化ファイルに静的callback_urlを提供することができところで.staging.domain.com * 1つのより多くのサブドメインを持っているステージングのコールバックURLについて

ですこの昨日のこの問題について 私は、静的なコールバックURLを提供しますが、Facebookは私にCRSFエラー発生させ次のいずれか:

omniauth: (facebook) Authentication failure! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected 

または私工夫が

https://*.domain.com/DEVISE_MODELS/auth/facebook 

ように見えるつもり動的callback_urlを設定し、この場合には、私はストレートを取得してみましょうを処理中のFGログイン中に一致しない/ホワイトリストに登録されたコールバックURL。

EDIT2:

GOOD!やった。ワイルドカードサブドメインでoauthログインできるようになりました。 ドメイン:」.domainを

  1. あなたの工夫初期化子
  2. の静的callback_urlを提供するには、としてあなたのセッションストアにドメインを追加します。私はどちらもCRSFのエラーを取得しても、CBのURL /ホワイトリストをnunmatchingてることを使用してCOM」

が、それはあなたのために働くだろう願っています!

+0

私は実際にこれを少し前に解決し、私の解決策を投稿するのを忘れてしまったのですが、本当に簡単です。あなたのソリューションをテストするためのリソースがありますが、それは実行可能なように見えるので、私はそれをアップヴォートにします。 – ACIDSTEALTH