0

この問題は数日間頭を悩ませていましたが、ようやく解決できたと思います。私は Facebook JS SDK を使用してクライアント側の認証を行っています。

FB.login(function(response) {
  if (response.authResponse) {
    var url = "/auth/facebook/callback?redirect=";
    url += '&' + $.param({ signed_request: response.authResponse.signedRequest });
    window.location = url;
  }
}, { scope:'email,publish_stream,publish_actions' })

signedRequest を手動で渡していることに注意してください。何らかの理由でそうしないと、「コード」パラメーターまたは署名付きリクエストが必要であるというエラーが表示されます ( OmniAuth Strategies Facebook NoAuthorizationCodeError (「コード」パラメーターまたは署名付きリクエストのいずれかを渡す必要があります (「signed_request を介して」) ` parameter): ) これは omniauth-facebook gem バージョン 1.4.0 を使用した場合です。最新の 1.4.1 を使用すると、他の誰もが経験しているように見える invalid_credentials の問題が発生します。

ログインしようとすると、奇妙なことが起こります。Chrome デバッガーをオンにして、[ネットワーク] タブに切り替えました。2 つのネットワーク リクエストが表示されます。どちらも GET です

https://www.MYHOST.com/auth/facebook/callback?redirect=&signed_request=BIGSTRINGHERE

ただし、興味深いことに、最初のリクエストのステータスは 301 で、2 番目のリクエストのステータスは 302 で、次のネットワーク リクエストは /auth/failure コールバックに対するものです。さらに不可解なことに、これはローカルでは再現されず、本番環境でのみ再現されます。ローカルでは動作し、http ステータスが 302 の単一のリクエストのみを実行します。

また、失敗のコールバックをヒットした後、私の Web サイトのホームページに戻り、ユーザーが FB ユーザーであり、サイトにアカウントを持っていることが検出されるため、自動ログイン機能がトリガーされることにも注意してください。このコードは同じコールバック URL にヒットし、成功します。

だから私の質問は、コールバックへの2番目のリクエストがあるのはなぜですか?おそらくログインを正しく機能させるために、それを取り除くにはどうすればよいですか? おまけの質問は、チュートリアルではこれを行う必要がないように思われるのに、なぜ signedRequest を手動で渡す必要があるのですか (RailsCast #360 など)?

詳細を明確にして提供するためのいくつかのメモ:

私は omniauth-facebook 1.4.0、omniauth 1.1.4、および omniauth-oauth 1.0.3 を使用しています。

私はDeviseを使用していません。また、Facebook omniauth を複数回初期化していないようです。

この問題はローカルでのみ発生し、同じ Facebook アプリ ID とシークレットを使用する本番環境では発生しません。ログイン URL は運用ドメインに設定されており、いくつかのローカル構成を使用して、運用ドメインがローカルを指すようにしています。

appID とシークレットが正しい (自動ログインが機能し、ローカルで機能する)。

Facebook アプリはサンドボックス モードではありません。

4

1 に答える 1

2

問題は、リダイレクト先のコールバックが https だったことが判明しました。そのページは https で利用できなかったため、http にリダイレクトされ、データの損失または不良データが発生しました。2 番目のリクエストが https ではなく http であることに気付きませんでした。そのコールバック アクションに対して ssl を有効にすると、問題が修正されました。

于 2013-06-18T21:06:18.613 に答える