OmniAuth Strategies Facebook NoAuthorizationCodeError (должен передать либо параметр `code`, либо подписанный запрос (через параметр` signed_request`):

Я получаю сообщение об ошибке:

 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 javascript sdk с facebook-omniauth

Ответ 1

Недавно я столкнулся с этой ошибкой, когда также использовал FB JS SDK с omniauth-facebook. Я исправил его, отправив параметр signed_request с помощью GET, как показано ниже:

$(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");
      });

Ответ 2

Когда вы получите сообщение об ошибке

  • Вы получите эту ошибку, если ваше приложение находится в режиме песочницы, и вы пытаетесь войти в систему с использованием реальных пользователей, которые не указаны в ролях разработчика для вашего приложения. После создания тестовых пользователей и их использования они будут работать.

  • Вы также получите эту ошибку в противоположной ситуации: вы пытаетесь войти в свое производственное приложение во время входа в facebook в качестве тестового пользователя. Вы получите эту ошибку, и в моем url я также получаю очень четкую информацию:

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

Как создать тестовых пользователей

Чтобы создать тестовых пользователей, нажмите "Изменить настройки" > "Роли разработчика" в конфигурации вашего приложения на developers.facebook.com и нажмите create на Тесте пользователей. После создания пользователя установите пароль, щелкнув по Set Password и запишите его идентификатор facebook, который вы можете визуализировать при нажатии modify. Затем используйте эти учетные данные для входа в приложение в режиме песочницы.

Ответ 3

Просто решил эту же проблему в моем коде, обновив драгоценные камни, чтобы:

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

Это была настоящая суть. Но в случае, если это вам понадобится, моя настройка route.rb:

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

Мой omniauth.rb

OmniAuth.config.on_failure = Proc.new { |env|
  OmniAuth::FailureEndpoint.new(env).redirect_to_failure
}

Ответ 4

Я получил ту же ошибку. Я попробовал решение выше, но это не сработало для меня. Поэтому я отключил режим песочницы, а затем работал так, как я ожидал.

Ответ 5

Facebook обновил там API до v.2.0 что приводит к ошибкам входа в систему fb. Решение состоит в том, чтобы иметь страницу политики конфиденциальности и поместить эту ссылку на ссылку приватной политики в разделе "Сведения о приложении" на сайте разработчиков facebook.

Ответ 6

Не задание cookie: true в FB.init приведет к этой проблеме.