FB.getLoginStatus返回状态未知

时间:2014-04-06 03:26:15

标签: javascript facebook api sdk facebook-javascript-sdk

使用有效的Facebook App调用FB.getLoginStatus时,响应状态始终未知。确切的回答是{authResponse:undefined,status:“unknown”}。

<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 App Settings的屏幕截图。 Facebook App Settings

11 个答案:

答案 0 :(得分:16)

我在Chrome中发生这种情况,原因是Chrome配置为阻止第三方Cookie和数据。

一旦我更改了配置,FaceBook就可以毫无问题地将我登录到我的应用程序。

  • Chrome设置
  • 显示高级设置...
  • 隐私
  • 内容设置......
  • 取消选中屏蔽第三方Cookie和网站数据

答案 1 :(得分:5)

我在Chrome中也遇到过这个问题。但是,在Firefox中,当用户之前登录时,它按预期工作,状态返回为connected

我从类似问题here的答案中找到了关于此的线索。

此问题的根本原因是,在FB.logout()上,Chrome未删除以某种方式影响fblo_<your-app-id>函数以返回FB.getLoginStatus()

的Cookie 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;';
}

答案 2 :(得分:4)

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

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

但不要问我为什么就是这种情况。它还修复了它需要在登录按钮上单击两次才能实际登录,甚至不需要appId,貌似,FWIW ......

答案 3 :(得分:3)

当我选中时,状态显示为"not_authorized",这没关系,因为我还没有授权该应用。

要完成此流程,只要用户ID未获得授权或未登录到Facebook,就应添加FB.login

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!
      }
   });
}

答案 4 :(得分:1)

我一直在发生这种情况,直到我打开浏览器以允许第三方网站保存和读取Cookie。

为此请转到

settings > advanced > site settings > Cookies and site data

然后取消选中阻止第三方网站保存和读取Cookie的选项。 这可能不是一个好的选择,但它为我解决了这些问题。 image

答案 5 :(得分:1)

你只需要让你的网站 URL 从 http 到 https

不要使用http

答案 6 :(得分:0)

我在IE中遇到了同样的问题。弗利奇的回答让我思考。我尝试以管理员身份运行IE,但它确实有用。

答案 7 :(得分:0)

我遇到了同样的问题,我通过清除所有缓存和cookie来修复此问题。

答案 8 :(得分:0)

最终答案

好吧,我想我终于找到了该死的问题。

您需要了解的内容:

1)您通过应用程序ID向Facebook进行身份验证。这将设置各种cookie,并在最后标记您的应用ID:

  • fblo_000000000000
  • fbm_000000000000
  • fbsr_000000000000

2)如果删除这些Cookie,您仍将以普通用户身份验证到Facebook (除非您完全注销)。并且他们在Facebook的服务器上仍然知道您已获得此应用的授权

  • 因此,当您再次运行FB.getLoginStatus()时,它将重新创建它们并将其重新放回。这不是您的用户所期望的。这是不好的。他们点击了“退出”。

3)docs explicitly say this

  

用户没有登录Facebook或明确退出了您的应用程序,因此它不会尝试连接到Facebook,因此,我们不知道他们是否已对您的应用程序进行身份验证。 (未知)

因此,他们甚至不尝试检查此cookie是否已设置。这就是为什么您会得到null或未定义的原因。因此fblo Cookie被视为“选择退出”。 您并未真正退出任何普通人认为退出的含义。 当然,如果用户使用登录按钮重新登录,则该cookie将被删除,这就是您和您的用户想要的。

因此,我认为唯一有意义的事情(如果您确实需要了解用户的状态)是:

  • 在运行fblo_<APPID>之前,手动检查FB.getLoginStatus cookie的存在。
  • 如果cookie不存在,则不执行任何操作并运行您的常规流程。
  • 如果cookie存在,那么您可以选择以下几种方式:

1)选项1

绝对不做任何事情。现在,您已经了解了该问题,知道了不删除cookie,也许除了显示Facebook登录按钮外,您无需执行其他任何操作。

2)选项2

您假定此人是您应用程序的用户,并执行显示UI所需的所有操作。但是您将无法运行完全正常的逻辑-这将是针对您的应用程序。

3)选项3

  • 手动将cookie值fblo_<APPID>设置为n(而不是'y')。请记住,此Cookie是在您的域上设置的,因此您可以对其进行更改。 *根据您的开发环境,这会有所不同,但是需要在客户端完成,并且您可能需要指定`/'的路径和cookie域。
  • 运行getLoginStatus(..., true)-现在不会阻止它,因为cookie现在是n。但是,您一定不要在此处运行常规逻辑-因为您要做的就是检查用户是否实际上是Facebook用户和/或仍通过您的应用程序进行了身份验证。
  • 手动将cookie值设置回y

不幸的是,由于奇怪的比赛条件,我不推荐这种解决方案。它几乎可以用,但是FB可能随时有意或无意间破坏了它-实际上,最终结果仍然令人困惑当您不在时,您实际上已经登录。另外,它甚至可能与我从未观察到的其他插件产生各种并发症。

我希望getLoginStatus能够始终运行并提供准确的信息,但这是我看到的唯一真正的解决方案。这样已经有8年了,所以我认为我们坚持了下去。

4)选项4-设置自己的Cookie

  • 您始终可以选择设置自己的Cookie来指示某些事情,例如“此用户已登录到Facebook”或“此用户已通过我的应用进行了身份验证”。但是我对此很谨慎,因为它很快就会变得复杂。

顺便说一句,我重新访问了此问题,因为我正在为网站使用Messenger插件,除非我知道此人拥有一个Facebook帐户,否则我根本不希望它显示。因此,我需要对登录状态做出准确的答复。

答案 9 :(得分:0)

您必须从实时域(您在应用程序中提供的)中进行测试。

在本地(使用本地域)进行测试时,我遇到了同样的问题。

答案 10 :(得分:0)

在我的情况下,我使用的是Brave浏览器,该浏览器由于其状态未知而不允许使用cookie。我切换到chrome,现在可以使用了。