首页 > 解决方案 > 为什么即使我已登录 Facebook 且未调用 FB.logout(),FB.getLoginStatus() 仍会返回响应状态“未知”?

问题描述

我们正在开发一个网站www.bodecanada.com。我们提供的登录方法之一是 facebook。我们还尝试在刷新页面或在新标签页中打开网站时跟踪用户是否登录到 facebook。我们通过调用 FB.getLoginStatus()(来自 Facebook js sdk)来做到这一点。但是,我们发现在少数情况下——例如,在 Safari 的新选项卡中打开站点时——从 FB.getLoginStatus 返回的响应状态为“未知”。Facebook SDK 文档说明了“未知”状态:

FB.getLoginStatus() 允许您确定用户是否登录到 Facebook 并验证了您的应用程序。用户有三种可能的状态:

  1. 用户已登录 Facebook 并已授权您的应用程序。(连接的)
  2. 用户已登录 Facebook,但尚未授权您的应用程序。(not_authorized)
  3. 用户要么未登录 Facebook,要么明确退出您的应用程序,因此它不会尝试连接到 Facebook,因此,我们不知道他们是否已经验证了您的应用程序。(未知)

在这种情况下,我们正在处理#3。但是,当我访问 facebook 时,我发现我没有注销。但与此同时,我并没有从我的网站“显式注销”(意味着调用 FB.logout())。那么为什么它会返回“未知”呢?

我在谷歌上找到的一个解决方案是添加 cookie: true to FB.init() 以启用第 3 方 cookie,所以我这样做了:

          FB.init({
            appId      : process.env.FB_APP_ID,
            cookie     : true,                             
            xfbml      : true, 
            version    : 'v2.2'
          });

但这并没有改变任何东西。

那么,当我在新选项卡中打开站点时,为什么 FB.getLoginStatus() 会为响应状态返回“未知”?

谢谢。

标签: facebooksessionfacebook-javascript-sdk

解决方案


当我关闭并重新打开浏览器时,我遇到了同样的问题。fb.login如果状态未知,我所做的是放置该功能。但是,必须在浏览器中启用紧急窗口:

function statusChangeCallback(response) {  
  if (response.status === 'connected') {   
    userId = response.authResponse.userID;
    accessToken = response.authResponse.accessToken;
    var userinfo = getUserInfo(userId);
  } else if (response.status === 'unknown') {            
    FB.login(function(response) {
      statusChangeCallback(response)
    }, {scope: 'public_profile,email'});
  }
}

推荐阅读