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)): 

它不会一直出现。 它会偶尔出现,由airbrake通知。

谷歌搜索有很多链接,但无法找到合适的解决方案..任何人? omizersuth.rb在initializers目录下:

 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

我最近在使用带有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"); }); 

当你收到错误

  • 如果您的应用程序处于沙盒模式并且您尝试使用未在应用程序的开发人员角色中列出的真实用户登录,则会出现此错误。 一旦您创建测试用户并使用它们,它就会起作用。

  • 在相反的情况下,您也会收到此错误:您在作为测试用户登录Facebook时尝试登录到您的生产应用程序。 你会得到那个错误,在我的url中我也得到了非常明确的信息:

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

如何创建测试用户

要创建测试用户,请单击developers.facebook.com上应用程序配置中的编辑设置>开发人员角色 ,然后单击测试用户部分上的create 。 创建用户后,单击“ Set PasswordSet Password ,记下其facebook ID,单击“ modify即可显示。 然后使用这些凭据以沙盒模式登录您的应用程序。

刚刚在我的代码中通过更新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 } 

我得到了同样的错误。 我试过上面的解决方案,但它对我不起作用。 所以我禁用沙箱模式然后它按预期工作。

Facebook已将API更新为v.2.0,导致fb登录错误。 解决方案是拥有一个隐私政策页面,并将该链接放在Facebook开发者网站的应用详情下的私人政策链接上。

不设置cookie: true FB.init cookie: true将导致此问题。

Interesting Posts