web-dev-qa-db-ja.com

Omniauth-Facebookはinvalid_credentialsを報告し続けます

Railscast#360で説明されているようにomniauth-facebookを実装しようとしていますが、かなりの障害にぶつかりました。サインインリンクをクリックすると、Facebookの資格情報を入力するように求めるポップアップが表示されますが、送信すると、OmniAuth :: Strategies :: OAuth2 :: CallbackErrorエラーが発生します。 Apacheログには、次のように出力されます。(facebook)認証に失敗しました。 invalid_credentials:OmniAuth :: Strategies :: OAuth2 :: CallbackError、OmniAuth :: Strategies :: OAuth2 :: CallbackError

関連するコードは次のとおりです。

omniauth.rb

OmniAuth.config.logger = Rails.logger

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, ENV['FACEBOOK_APP_ID'], ENV['FACEBOOK_SECRET']
end

sessions_controller.rb

class SessionsController < ApplicationController
  def create
    user = User.from_omniauth(env["omniauth.auth"])
    session[:user_id] = user.id
    redirect_to root_url
  end

  def destroy
    session[:user_id] = nil
    redirect_to root_url
  end
end

application.html.erb

<div id="fb-root"></div>
<script>        
window.fbAsyncInit = function() {
    FB.init({
        appId      : '(**my app id**)', // App ID
        status     : true, // check login status
        cookie     : true // enable cookies to allow the server to access the session
    });

    $('#sign_in').click(function(e) {
        e.preventDefault();
        return FB.login(function(response) {
            if (response.authResponse) {
                return window.location = '/auth/facebook/callback';
            }
        });
    });

    return $('#sign_out').click(function(e) {
        FB.getLoginStatus(function(response) {
            if (response.authResponse) {
                return FB.logout();
            }
        });
        return true;
    });
};
 </script>

簡単なものが足りませんか?私はここ数日、解決策を探していました。

28
petfreshman

Omn​​iauth-facebookv1.4.1でCSRFに問題が発生したようです。一時的な修正は、v1.4.0にロールバックすることです。 Gemfileで、omniauth-facebookの行を次のように変更します。

gem 'omniauth-facebook', '1.4.0'

問題を報告しました: https://github.com/mkdynamic/omniauth-facebook/issues/7

68
Tom Söderlund

1人のユーザーで機能していたのに、2人目のユーザーで認証エラーが発生するという同様の問題が発生しました。

サンドボックスモードを無効にすると([アプリ]> [設定]> [詳細])、修正されたようです。

6

Omn​​iauth.rbに次のコードを追加します。

OmniAuth.config.on_failure = Proc.new do |env| new_path = "/auth/failure"
 [302, {'Location' => new_path, 'Content-Type'=> 'text/html'}, []]
end
1
Tiago

Omn​​iauth-oauth2> 1.0.3でも問題が発生することに気づきました。上位バージョンをアンインストールし、omniauth-oauth21.0.3で問題を解決しました。

1
simo

私もこれを持っています。

application.html.erbのJSスクリプトを削除します(ただし、fb-root divは保持します)。とにかく、FBログイン画面はポップアップウィンドウに表示されなくなり、代わりにFBログインにリダイレクトされてからサイトに戻ります。

0
Giang Nguyen

私のように不注意な人のために、

Remember to switch you app out of Sandbox modeデプロイする前にdevelopers.facebookで!

サンドボックスモードでは、開発者のアカウントを除くすべてのユーザーに対してcsrfエラーがトリガーされます。

0
umezo

omniauthCallbacksControllerをオーバーライドして、これをロギングに追加することをお勧めします。

class OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def failure_message
    exception = env["omniauth.error"]
    #add login here:
    Rails.logger.info "exception: #{exception.inspect}"
    error   = exception.error_reason if exception.respond_to?(:error_reason)
    error ||= exception.error        if exception.respond_to?(:error)
    error ||= env["omniauth.error.type"].to_s
    error.to_s.humanize if error
  end

  #other code ...
end

私が追加した後、「無効なIP ...」の問題が見つかりました。

0
James Tan