我收到错误:
OmniAuth::Strategies::Facebook::NoAuthorizationCodeError (must pass either a
`code` parameter or a signed request (via `signed_request` parameter or a
`fbsr_XXX` cookie)):
它不会一直出现。它会偶尔出现,由airbrake通知。
谷歌搜索有很多链接,但无法找到合适的解决方案..任何人? omiminuth.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-omniauth
的facebook javascript sdk答案 0 :(得分: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");
});
答案 1 :(得分:8)
如果您的应用处于沙盒模式并且您尝试使用未在应用程序的开发人员角色中列出的真实用户登录,则会出现此错误。一旦您创建测试用户并使用它们,它就会起作用。
在相反的情况下,您也会收到此错误:尝试以测试用户身份登录Facebook时登录您的生产应用。您将收到该错误,在我的网址中我也会得到非常明确的信息:
error_code=2102&error_message=User+is+not+a+test+user+owned+by+the+application
要创建测试用户,请点击修改设置>开发人员角色位于developers.facebook.com的应用配置中,然后点击测试用户部分的create
。创建用户后,单击Set Password
设置密码并记下其facebook id,您可以在单击modify
时查看该ID。然后使用这些凭据以沙盒模式登录您的应用程序。
答案 2 :(得分:5)
通过将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
}
答案 3 :(得分:5)
我得到了同样的错误。我试过上面的解决方案,但它对我不起作用。所以我禁用沙箱模式然后它按预期工作。
答案 4 :(得分:0)
Facebook已将API更新为v.2.0 这会导致fb登录错误。 解决方案是建立一个隐私政策页面,并将该链接放在Facebook开发者网站的应用程序详细信息下的私人政策链接上。
答案 5 :(得分:0)
未在cookie: true
中设置FB.init
会导致此问题。