【问题标题】:OmniAuth Strategies Facebook NoAuthorizationCodeError (must pass either a `code` parameter or a signed request (via `signed_request` parameter):OmniAuth Strategies Facebook NoAuthorizationCodeError(必须传递“code”参数或签名请求(通过“signed_request”参数):
【发布时间】:2012-09-11 12:45:35
【问题描述】:

我收到一个错误:

 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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 这对我有用,但我也注意到在我的情况下 fbsr_XXX cookie 存在,除了前缀有空格(例如“fbsr_XXX”),这阻止了omniauth gem用于定位应该已经存储在 cookie 中的数据的代码。至于为什么 cookie 键有空格,我不确定。我的印象是 FB JS 设置了这些 cookie。
    • 这可能与您的浏览器 3rd 方 cookie 设置有关吗?
    • @dimrock 尝试了这个解决方案,并通过解析的 signed_request 参数传递了正确的请求 URL,但仍然出现错误。有什么想法吗? @JZC 你怎么看你的fbsr_XXX cookie 是什么?
    • @james 你的“FB.init”函数中有属性“cookie: true”吗?
    • 与@james 相同的问题。已附加 signed_request cookie。但仍然得到错误。而@JZC如何检查fbsr_xxx是否有空格?
    【解决方案2】:

    当你得到错误时

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

    • 在相反的情况下,您也会收到此错误:您在以测试用户身份登录 facebook 时尝试登录生产应用程序。你会得到那个错误,在我的网址中我也得到了非常清楚的信息:

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

    如何创建测试用户

    要创建测试用户,请在developers.facebook.com 的应用程序配置中点击Edit settings > Developer Roles,然后在Test users 部分点击create。创建用户后,单击Set Password 设置密码并记下其facebook id,单击modify 时可以看到该ID。然后使用这些凭据以沙盒模式登录您的应用。

    【讨论】:

    • 也许我的回答不是很好,尽管它对我有用。我不介意投反对票,但如果人们能解释他们投反对票的原因,那就太好了,这样我们都可以学到一些东西。
    • 实际也发生在人不接受FB界面的第一个应用需求时。我只是在努力正确地捕捉到这个错误。
    【解决方案3】:

    刚刚通过将 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
    }
    

    【讨论】:

    • 收到错误,即:身份验证失败! invalid_credentials: OmniAuth::Strategies::OAuth2::CallbackError, OmniAuth::Strategies::OAuth2::CallbackError
    • 您使用的是哪个版本的“oauth2”和“omniauth-oauth2”gem?
    【解决方案4】:

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

    【讨论】:

    • 刚刚发生了同样的事情;然后我想通了:如果禁用沙盒模式对您有用,那是因为您尝试验证的 Facebook 帐户未列在您的应用程序的开发人员角色中 (developers.facebook.com/apps/<APPID>/roles)。
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      FB.init中不设置cookie: true会导致这个问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-02
        • 2016-04-03
        相关资源
        最近更新 更多