この問題は数日間頭を悩ませていましたが、ようやく解決できたと思います。私は 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 アプリはサンドボックス モードではありません。