2011-07-11 7 views
34

私は、/ users/auth/facebookを読み込んでFacebookに接続する機能をアプリに持っています。私はその要求がどこから来たのか知ることができるようにしたい。 Facebookに登録しているユーザーからのものであっても、単にFacebookとの接続を望む既存のユーザーからのものであってもかまいません。タイプに基づいて、応答は非常に異なります。Devise + Omniauth - 余分なパラメータを渡すには?

認証時にomniauthにパラメータを渡すにはどうすればよいですか。私がやってみました:

/users/auth/facebook?connect_action=signup_connect_to_facebook 

をしかし、それはAuthenticationsController位

アイデアを作成打つときにconnect_actionのparamがそれをしませんでしたか? Thansk

答えて

93

あなたが

omniauth_authorize_path(:user, :facebook, var: 'value', var2: 'value2') 

のように、:paramsオプションを使用する必要があり、後でコールバックで、あなたはハッシュを取得するためにrequest.env['omniauth.params']にアクセスすることができます! :)

+8

完全にちょうど私のお尻を保存しました。ありがとうございます。 –

+2

これは理想的には動作しますが、コードにバグがあります! https://github.com/intridea/omniauth/issues/543 私はセッションに値を割り当て、コールバックでそれをクリアしました:) – whizcreed

+1

私はそれを問題なく使用しています! (1.1.0) – fuzzyalej

8

リクエストがアプリケーション内の別のページから作成された場合は、request.env ['omniauth.origin']を調べることができます。 Omniauthはこの変数を自動的に保存します。

Hereは限りカスタムパラメータを渡すなど、より詳細な説明

ですが、私は失敗し、これを行うことを試みました。回避策は、hereの説明に従ってプロバイダに行く前にセッションに格納することです。

希望すると、これが役立ちます。

+0

omniauth + deviseはそれをサポートしていますか? –

+0

Yeap、Im私のアプリでこれをdeviseとomniauthの両方で使用しています – e3matheus

+0

この記事では、このアプローチを使用しました。しかし、@ fuzzyalejによって提案された解決策が働いてきれいに見えるので、段階的に取り除いた。 –

1

facebookの場合、 'state'パラメータを使用して、必要なものを渡しますが、エンコードを忘れないでください。

/users/auth/facebook?state=parameter 

パラメータをjsonでエンコードされたURLフォームとして送信し、次にコールバックで解析できます。

+2

でメソッドに渡す必要があります。 'state'パラメータは、サイト間要求偽造(CSRF)トークンを渡すためにのみ使用されるべきです。 – Ashitaka

関連する問題