FB.getLoginStatus返回状态未知

问题描述 投票:15回答:7

当使用一个有效的Facebook应用响应状态调用FB.getLoginStatus永远是未知的。确切的回应是{authResponse:未定义,状态: “未知”}。

<html>
<body>
    <div id="fb-root"></div>

    <script>
    window.fbAsyncInit = function(){
        FB.init({ appId:'1484134468466778', status:true,  cookie:true, xfbml:true});
        FB.getLoginStatus(function(response){
        console.log(response);
        });
    };

    (function(d){
        var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
        js = d.createElement('script'); js.id = id; js.async = true;
        js.src = "//connect.facebook.net/en_US/all.js";
        d.getElementsByTagName('head')[0].appendChild(js);
    }(document));
    </script>
</body>
</html>

例如网址:http://media.tuentifotos.com/simple_test.html

在这里,Facebook的应用程序设置的屏幕截图。

javascript facebook api sdk facebook-javascript-sdk
7个回答
16
投票

这是在Chrome中发生的事情对我来说,和是因为Chrome的配置为阻止第三方Cookie和数据。

一旦我做了配置更改,Facebook是能够给我登录到我的应用程序没有问题。

  • Chrome设置
  • 显示高级设置...
  • 隐私
  • 内容设置...
  • 取消选中阻止第三方Cookie和网站资料

5
投票

在Chrome中我也遇到了这个问题。然而,在Firefox它的工作如预期与当用户在之前已经登录返回connected状态。

我发现了这个线索从答案类似的问题here

这个问题的根源是,在FB.logout(),浏览器无法取出饼干fblo_<your-app-id>这在某种程度上影响FB.getLoginStatus()函数返回unknown

修复:在调用FB.logout(),您可以通过编程删除cookie fblo_<your-app-id>

FB.logout(function(response) {
  deleteCookie("fblo_" + fbAppId); // fblo_yourFBAppId. example: fblo_444499089231295
});

function deleteCookie(name) {
  document.cookie = name +'=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
}

4
投票

对我来说,这意味着“我的登录页面上的”我需要指定cookie。

  window.fbAsyncInit = function() {
   FB.init({
      version: 'v2.8',
      cookie     : true,
    });
  };

但是,不要问我为什么是这种情况。它还固定它需要对登录按钮点击两次进行实际的登录,甚至不需要APPID,貌似,FWIW ...


3
投票

当我检查时,其状态显示"not_authorized"这很好,因为我没有授权的应用程序呢。

要完成整个流程,你应该添加FB.login只要用户ID没有被授权或者没有登录到Facebook:

window.fbAsyncInit = function(){
    FB.init({ appId:'{APP-ID}', status:true,  cookie:true, xfbml:true});
    FB.getLoginStatus(function(response){
        if (response.status === 'connected') {
           //proceed
        } else if (response.status === 'not_authorized') {
           login();
        } else {
          login();
        }
    });
};

function login(){
   FB.login(function(response) {
      if (response.authResponse) {
         // proceed
      } else {
         // not auth / cancelled the login!
      }
   });
}

1
投票

The final answer

好了,所以我想我终于想通这个该死的问题了。

你需要知道的:

1)你通过应用程序ID与Facebook进行认证。这种设置各种饼干,你的应用程序ID进行标记的结尾:

  • fblo_000000000000
  • fbm_000000000000
  • fbsr_000000000000

2)如果您删除这些cookie,你还在验证给Facebook作为一个普通用户(除非你退出完全)。而在Facebook的服务器,他们仍然知道你被授权使用此应用。

  • 所以,当你FB.getLoginStatus()再次运行它只会重新创建它们,然后再次把它们放回去。这是不是你的用户期望的结果。这不好。他们点击“注销”。

3)docs explicitly say this

用户要么无法登录到Facebook或明确地登出您的应用程序,因此它不会试图连接到Facebook,因此,我们不知道他们是否已经验证您的应用程序或没有。 (未知)

因此,他们甚至没有尝试检查,如果这个cookie设置。这就是为什么你会得到null或undefined。所以fblo饼干被认为是像“退出”。您实际上并不由什么任何普通的人会考虑被登出来的意思注销。这里还有一个cookie说你是谁!当然,如果用户在登录按钮,则cookie将被删除,这是你和你的用户想要什么重新登录。

因此,我认为,情理之中的事(如果你真正需要知道用户的身份)是唯一的事情:

  • 手动检查qazxsw POI cookie的存在运行qazxsw POI之前。
  • 如果cookie不存在,则什么也不做,运行正常流动。
  • 如果cookie是存在的,你有几种选择:

1)方案1

什么都不做。现在你明白了这个问题,你明白不删除cookie,也许你并不需要做的不是显示Facebook登录按钮的任何其他。

2)方案2

你认为这个人是你的应用程序的用户,并且做任何你需要做的,以显示UI。但你不会运行完整的正常的逻辑 - 这将是应用特定的给你。

3)方案3

  • 手动设置cookie值fblo_<APPID>FB.getLoginStatus(而不是“Y”)。记住所以你被允许更改这个cookie设置你的域名。 *根据您的开发环境中,这会有所不同,但它需要做的客户端,您可能需要指定的'/”的路径和您的Cookie域)。
  • 运行fblo_<APPID> - 它不会被堵塞,现在因为cookie是现在n。但是你不能在这里运行正常的逻辑 - 因为所有你想要做的是检查,如果用户实际上是一个Facebook的用户和/或与您的应用程序通过身份认证。
  • 手动设置cookie值回getLoginStatus(..., true)

不幸的是我不能推荐这种解决方案由于怪异的竞争条件。它几乎差不多的工作,但FB随时可能有意或无意打破它 - 它实际上最终还是感到困惑想着你真正登陆你是不是当英寸加上它可能有着千丝万缕的我还没有发现其他插件并发症。

我希望n只想始终运行和提供准确的信息,但是这是唯一真正的解决办法我看。因此,我认为,我们坚持了下来它已经这样了8年。

4)选项4 - 设置您自己的cookie

  • 你总是要设置自己的cookie来表明某些东西,比如“这样用户在登录到Facebook的一些点”或“该用户进行身份验证我的应用程序”选项。但我谨慎,这样做是因为它可以迅速变得复杂。

顺便说一句我重新审视这个问题,因为我使用Messenger的插件为我的网站,我不希望它显示在所有除非我知道这个人有一个Facebook帐户。所以,我需要一个精确的响应登录状态。


0
投票

我在IE浏览器相同的问题。 Flimzy的回答让我思考。我试图运行IE浏览器,管理员和它的工作。


0
投票

我有同样的问题,我通过清除所有缓存和Cookie解决了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.