ruby-on-rails - OmniAuth 策略 Facebook NoAuthorizationCodeError(必须传递 `code` 参数或签名请求(通过 `signed_request` 参数):

标签 ruby-on-rails facebook facebook-javascript-sdk omniauth

我收到一个错误:

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

它不是一直都来的。它偶尔会来,由减速板通知。

在谷歌搜索上有很多链接,但无法找到合适的解决方案。有人吗? initializers目录下的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

最佳答案

我最近在将 FB JS SDK 与 omniauth-facebook 一起使用时遇到了这个错误。 我通过使用 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");
      });

关于ruby-on-rails - OmniAuth 策略 Facebook NoAuthorizationCodeError(必须传递 `code` 参数或签名请求(通过 `signed_request` 参数):,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12370056/

相关文章:

ruby-on-rails - 为 ruby​​ on rails 应用程序生成 WAR 文件

android - Facebook Android SDK 源代码无法使用 Eclipse Indigo 进行编译

javascript - FB.getLoginStatus 触发浏览器弹出窗口阻止程序。我怎样才能阻止它?

javascript - 如何制作需要点击的Facebook登录按钮?

javascript - Ruby on Rails -> 动态创建 div

ruby-on-rails - 使用 Rails 4 响应未授权 (401) 状态

ruby-on-rails - 用于模型中动态自定义字段的 Rails gem/插件

java - 使用 Android 共享 Intent 在 Facebook 中共享文本

jquery - 当 href 参数是变量时,Facebook 共享对话框不起作用

facebook - 我在 localhost Facebook 应用程序开发中做错了什么?