web-dev-qa-db-ja.com

OmniAuthを介してパラメーターを渡す

コールバックアクションにいくつかのパラメーターを渡す必要があります。ソースコードから判断すると、OmniAuthはコールバックURLにクエリ文字列を追加する必要がありますが、奇妙なことに追加しません。開いたら

/auth/facebook?from=partner

...そしてFacebookにリダイレクトされます、return_urlはただ

/auth/facebook/callback

...パラメータなし。

53
synapse

上記のすべての答えに苦労した後、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"]では、シンボルではなく引用符を使用する必要があります。

76
nfriend21

私はクッキーのことはうまくいくと思いますが、ここに記載されているように状態変数を使用できる場合、なぜすべてを行うのですか: 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#_=_

これで、コールバックハンドラーで状態を処理できます

22
user566245

以下のように、:paramsオプションを使用できます

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

後でコールバックでrequest.env['omniauth.params']にアクセスしてハッシュを取得できます! :)

この回答 からコピー)

12
Nimo

あなたがしたいことは、URLにパートナー名を含めるようにコールバックを動的に設定することです(noturlパラメータ)、認証トランザクションごとに、どのパートナーが関与しているかによって異なります。これは、認証要求ごとにコールバックURLを動的に設定することを意味します。 開始するためのこのブログ投稿 を参照してください。コールバックURLは、お気づきのとおり、自動的にURLパラメーターをドロップするため、パラメーターでこれを行うと機能しません。

そのため、パートナー名/ IDをパラメーターとして渡すのではなく(ドロップされます)、partner_idとOmniAuth providerはコールバックURLの一部であり、次のようなものになります。

/auth/:omniauth_provider/callback/:partner_id

...有効なコールバックは次のようになります

/auth/facebook/callback/123456

...その後、特定のコールバックがFacebookから着信し、パートナーID 123456

7
jefflunt

OmniAuthには、ユーザーがどこにいたかを知るための組み込みの方法が既にあります。これは、「Origin」と呼ばれ、ここに記載されています。

https://github.com/intridea/omniauth/wiki/Saving-User-Location

6
David Morales

ご存知のように、私はこれを難しい方法で解決しようとしているのではないかと思います。

クッキーが答えかもしれません。これを解決するには、ログインアクションに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を作成し、コールバックがヒットしたときに削除することは大したことではありません。

1
jefflunt