18

我收到一个错误:

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

它不会一直来。它会时不时地来,由空气制动通知。

谷歌搜索上有很多链接,但找不到合适的解决方案..有人吗?初始化程序目录下的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的应用程序配置中单击编辑设置 > 开发人员角色,然后单击 测试用户部分。创建用户后,单击设置密码并记下其 facebook id,单击 时您可以看到该 id 。然后使用这些凭据以沙盒模式登录您的应用程序。createSet Passwordmodify

于 2013-10-05T10:25:11.457 回答
6

刚刚通过将 gems 更新为:

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 回答
0

不设置cookie: trueFB.init导致这个问题。

于 2017-03-02T19:56:46.613 回答