コールバックアクションにいくつかのパラメーターを渡す必要があります。ソースコードから判断すると、OmniAuthはコールバックURLにクエリ文字列を追加する必要がありますが、奇妙なことに追加しません。開いたら
/auth/facebook?from=partner
...そしてFacebookにリダイレクトされます、return_url
はただ
/auth/facebook/callback
...パラメータなし。
上記のすべての答えに苦労した後、Facebookに関して何をすべきかを見つけました。デフォルトでは、request.env["omniauth.auth"]
のパラメーターは表示されません。
そのため、コールバックにクエリ文字列を使用している場合、次のようなものになります。
"/auth/facebook?website_id=#{@website.id}"
Website_idパラメータを取得する唯一の方法は、request.env["omniauth.params"]
を使用することです。 注:omniauth.authではなくomniauth.paramsを使用することを確認してください-これによりしばらくつまずきました。
次に、これをテストするために、コントローラーアクション内で検査できます(RAISE行に注意してください)。
def create
raise request.env["omniauth.params"].to_yaml
# the rest of your create action code...
end
そこにパラメーターが表示されます。すごい。次に、コントローラーに戻り、そのRAISE行を削除します。次に、コントローラーアクションで次のようにパラメーターにアクセスできます。
params = request.env["omniauth.params"]
website_id = params["website_id"]
注:params ["website_id"]では、シンボルではなく引用符を使用する必要があります。
私はクッキーのことはうまくいくと思いますが、ここに記載されているように状態変数を使用できる場合、なぜすべてを行うのですか: https://github.com/mkdynamic/omniauth-facebook
これは私がそれを使用した方法です:
uRLを作成するときに、クエリ文字列に状態を追加するだけで、コールバックURLでも使用できるようになります。
user_omniauth_authorize_path(:facebook, :display => 'page', :state=>'123') %>
これで、コールバックURLは
http://localhost:3000/users/auth/facebook/callback?state=123&code=ReallyLongCode#_=_
これで、コールバックハンドラーで状態を処理できます
以下のように、:params
オプションを使用できます
omniauth_authorize_path(:user, :facebook, var: 'value', var2: 'value2' )
後でコールバックでrequest.env['omniauth.params']
にアクセスしてハッシュを取得できます! :)
( この回答 からコピー)
あなたがしたいことは、URLにパートナー名を含めるようにコールバックを動的に設定することです(noturlパラメータ)、認証トランザクションごとに、どのパートナーが関与しているかによって異なります。これは、認証要求ごとにコールバックURLを動的に設定することを意味します。 開始するためのこのブログ投稿 を参照してください。コールバックURLは、お気づきのとおり、自動的にURLパラメーターをドロップするため、パラメーターでこれを行うと機能しません。
そのため、パートナー名/ IDをパラメーターとして渡すのではなく(ドロップされます)、partner_id
とOmniAuth provider
はコールバックURLの一部であり、次のようなものになります。
/auth/:omniauth_provider/callback/:partner_id
...有効なコールバックは次のようになります
/auth/facebook/callback/123456
...その後、特定のコールバックがFacebookから着信し、パートナーID 123456
OmniAuthには、ユーザーがどこにいたかを知るための組み込みの方法が既にあります。これは、「Origin」と呼ばれ、ここに記載されています。
https://github.com/intridea/omniauth/wiki/Saving-User-Location
ご存知のように、私はこれを難しい方法で解決しようとしているのではないかと思います。
クッキーが答えかもしれません。これを解決するには、ログインアクションにCookieを保存してから、適切な/auth/:provider
認証のパス、およびコールバックがトリガーされたとき(SessionsController#create
)、Cookieを読み戻してリダイレクト先を確認します。
そのため、現在、「facebookでログイン」リンク(またはアプリにあるもの)はおそらく/auth/facebook
。代わりに、次のようなカスタムアクションを作成した場合
POST /partner_auth
...そしてURLでそれを呼び出しました...
POST example.com/partner_auth?from=partner&provider=facebook
次に、次のようなコントローラーがあります。
class PartnerAuth < ApplicationController
def create
cookies[:from] = params[:from] # creates a cookie storing the "from" value
redirect_to "auth/#{params[:provider]"
end
end
次に、SessionsController#create
アクション、あなたは...
def create
...
destination = cookies[:from]
cookies[:from].delete
redirect_to destination # or whatever the appropriate thing is for your
# app to do with the "from" information
end
私は他の回答で概説したことを達成するためにデモアプリを構築しようとしましたが、あなたは正しいです-カスタム認証コールバックをOmniAuthコードに動的に挿入しようとするのは複雑すぎました。デフォルトのコールバックを上書きする設定オプションがありますが、動的に設定するのは簡単ではないようです。
だから、クッキーははるかに簡単でユーザー固有であり、理論的にはこのfrom
情報を非常に短時間(ユーザーが認証を試みるときと、コールバックがトリガーされます)、Cookieを作成し、コールバックがヒットしたときに削除することは大したことではありません。