18

エラーが発生します:

 OmniAuth::Strategies::Facebook::NoAuthorizationCodeError (must pass either a 
`code` parameter or a signed request (via `signed_request` parameter or a 
`fbsr_XXX` cookie)):

いつも来ているわけではありません。たまに来る、エアブレーキでお知らせ。

Google検索にはこれに関するリンクがたくさんありますが、適切な解決策を見つけることができません..誰か?初期化ディレクトリの下の omniauth.rb:

OmniAuth.config.logger = Rails.logger
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET'], {:client_options => {:ssl => {:ca_path => "/etc/ssl/certs"}}, :scope => 'user_about_me,email,publish_actions,user_location,publish_stream,offline_access,user_interests,user_likes,user_hometown', :display => 'popup'}      

  OmniAuth.config.on_failure = Proc.new do |env|
    #this will invoke the omniauth_failure action in SessionsController.
    "SessionsController".constantize.action(:omniauth_failure).call(env)
  end         
end

PS: facebook-omniauthで facebook javascript sdk を使用しています。

4

6 に答える 6

26

最近、omniauth-facebook で FB JS SDK も使用しているときにこのエラーが発生しました。以下に示すように、GETでsigned_requestパラメーターを送信して修正しました。

$(document).bind("fb.loaded", function() {
  FB.getLoginStatus(function(response) {

    console.log('FB STATUS: ' + response.status);
    if(response.status == "connected") {

      console.log("FB AUTHED");

      location.href =
        '/auth/facebook/callback?' +
        $.param({ signed_request: response.authResponse.signedRequest })
      });

    }
  });
});

このシナリオは、ユーザーが FB に既にログインしているがサイトにはログインしていないときにサイトにアクセスした場合に発生します。多くの場合、omniauth コールバックへの後続のリクエストに署名する必要があります。

Request URL:
http://localhost:3000/auth/facebook/callback?signed_request=QXZa2TPs8JiSgSAQkrS7Y7ObPZQDYLcU_JNvD6Wru_o.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImNvZGUiOiJBUURjQXdZUdVOMEFmd1RCbjRDQWp4eHpKcWRoRllOS1owLVZpa2pKTUQxSU1UbHJzbmEyMVNUUUtOLWl6b1dJOXJVRWUyWTBNd3ViZ1JxcmZJQmVMRDNOREI2M1EwREtqVzJCeVxTU2ZMR1foWlVwOEVlX0dMVUtwYUlqcWlaQ2FSc1h5c0NBNHdyZDBxbk4taU1haWp2cVFIX19QdUhxaldFcUtYZDc1LS1oZmptcTg4QVVuemVJdDJ4S2VOd3VPZG9vOGtaQkZlZmctZ2FDMk9CNl8wZ24iLCJpc3N1ZWRfYXQiOjEzNTg5NzQ4NzMsInVzZXJfaWQiOiIxMDYwMTg4NyJ9`

AJAX を使用している場合は、次のようなものが必要になります。

      $.get(
        '/auth/facebook/callback',
        { signed_request: response.authResponse.signedRequest },
        function(json) {
          alert("received logged in response");
      });
于 2013-01-23T21:06:08.367 に答える
8

エラーが発生した場合

  • アプリがサンドボックス モードであり、アプリケーションの開発者ロールにリストされていない実際のユーザーを使用してログインしようとすると、このエラーが発生します。テストユーザーを作成して代わりに使用すると、機能します。

  • 逆の状況でもこのエラーが発生します。テスト ユーザーとして facebook にログインしているときに、本番アプリにログインしようとします。あなたはそのエラーを受け取り、私のURLには非常に明確な情報も得られます:

error_code=2102&error_message=User+is+not+a+test+user+owned+by+the+application

テスト ユーザーの作成方法

テスト ユーザーを作成するには、 developers.facebook.comのアプリケーション構成で[ Edit settings] > [Developer Roles ] をクリック し、 [ Test users ]セクションをクリックします。ユーザーを作成したら、 をクリックしてパスワードを設定し、 をクリックすると視覚化できる Facebook ID を書き留めます。次に、それらの資格情報を使用して、サンドボックス モードでアプリにログインします。createSet Passwordmodify

于 2013-10-05T10:25:11.457 に答える
6

宝石を次のように更新することで、コードでこの同じ問題を解決しました。

gem "omniauth", "~> 1.1.1"
gem "omniauth-facebook", "~> 1.4.1"

それがまさに核心でした。ただし、必要な場合に備えて、routes.rb 設定:

match "/auth/failure" => redirect("/")

私のomniauth.rbは

OmniAuth.config.on_failure = Proc.new { |env|
  OmniAuth::FailureEndpoint.new(env).redirect_to_failure
}
于 2012-09-20T21:37:27.857 に答える
5

同じエラーが発生しました。上記の解決策を試しましたが、うまくいきませんでした。そのため、サンドボックス モードを無効にすると、期待どおりに機能しました。

于 2013-05-03T05:34:26.090 に答える
0

Facebook が API を v.2.0 に更新したため、fb ログイン エラーが発生しました。解決策は、プライバシー ポリシー ページを用意し、そのリンクを Facebook 開発者サイトのアプリの詳細の下にあるプライバシー ポリシー リンクに配置することです。

于 2015-05-06T02:54:29.927 に答える