FB JS-SDK 无法检测到用户直接退出 FB

Posted

技术标签:

【中文标题】FB JS-SDK 无法检测到用户直接退出 FB【英文标题】:FB JS-SDK cannot detect user logging out of FB directly 【发布时间】:2011-10-22 04:34:50 【问题描述】:

TL;DR Facebook javascript SDK 无法确定直接从其下的 facebook.com 注销的用户的准确登录状态。

我正在开发一个使用 javascript SDK 进行身份验证的 Facebook 应用程序。我注意到,当用户直接退出 Facebook(在 facebook.com 上)时,SDK 无法理解用户在应用页面上的登录状态。我将其归结为以下简单的测试用例。

在一个标签中登录 facebook.com。在另一个选项卡中,呈现下面的应用页面(根据需要替换 MY_APP_ID)。如果您以从未授予此应用程序权限的用户身份登录 facebook,请单击“登录”并授予他们权限。无论哪种方式,您都应该看到一些事件触发,表明您已登录。

现在,回到 facebook.com 选项卡,退出 facebook。转到应用选项卡并单击所有按钮(“登录”除外)并查看浏览器控制台输出。

FB.logout 被调用时,什么也没有发生。永远不会调用回调。在 Chrome 中,给出以下错误:“不安全的 JavaScript 尝试从 URL http://www.facebook.com/ 的框架访问具有 URL http://my_app.com 的框架。域、协议和端口必须匹配。”

当调用FB.getLoginStatus 时,响应会显示“已连接”并具有 authResponse 对象。但是,这没有帮助,因为它现在不正确。相反,如果为“force”参数传入 true,则不会发生任何事情(永远不会调用回调)。

FB.getAuthResponse 被调用时,什么也没有发生(回调永远不会被调用)。

在此期间不会触发任何相关事件(即在注销 facebook 之后)。

那么问题在于,在这种情况下,似乎无法从 SDK 合法地确定用户的登录状态。或者我正在做一些愚蠢的事情,尽管我已经把它归结为最低限度。

我的最终目标是,如果用户在退出 Facebook 后单击我的退出按钮,我希望能够在这种情况下做 一些事情。但是 SDK 没有提供实现这一目标的可行方法。

有什么想法或想法吗?有没有其他人经历过这种情况并找到了解决方法?谢谢!

简单的应用页面:

<html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml' xmlns:fb='http://www.facebook.com/2008/fbml'>
<head>
</head>
<body>
<script>
  window.fbAsyncInit = function() 
    function subFBEvent(name) 
      FB.Event.subscribe(name, function(r) 
        console.log(name);
        console.log(r);
      );
    
    subFBEvent('auth.login');
    subFBEvent('auth.logout');
    subFBEvent('auth.authResponseChange');
    subFBEvent('auth.statusChange');
    FB.init(
      appId  : 'MY_APP_ID',
      status : true, // check login status
      cookie : true, // enable cookies to allow the server to access the session
      xfbml  : true,  // parse XFBML
      oauth  : true       // use OAuth 2.0
    );
  ;
  (function() 
    var s = document.createElement('div'); 
    s.setAttribute('id','fb-root'); 
    document.documentElement.getElementsByTagName("body")[0].appendChild(s);
    var e = document.createElement('script');
    e.src = 'http://connect.facebook.net/en_US/all.js';
    e.async = true;
    s.appendChild(e);
  ());
</script>
<button onclick="FB.logout(function(r)  console.log('FB.logout'); console.log(r); );">Logout</button>
<button onclick="FB.getLoginStatus(function(r)  console.log('FB.getLoginStatus'); console.log(r); );">LoginStatus</button>
<button onclick="FB.getAuthResponse(function(r)  console.log('FB.getAuthResponse'); console.log(r); );">AuthResponse</button>
<fb:login-button>Login</fb:login-button>
</body>

【问题讨论】:

只是强制往返于 Facebook 服务器。看***.com/questions/9482876/… 【参考方案1】:

我认为这个解决方案现在不会对您有所帮助,但我发布它是为了让其他人不会有这么难的时间。 这是因为您没有正确实现 FB.getLoginStatus 方法。 你所要做的就是实现这个方法

 FB.getLoginStatus(function(response) 
    statusChangeCallback(response);
  );

在初始化调用之后。该方法会调用statusChangeCallback方法进行认证。

function statusChangeCallback(response) 
    console.log('statusChangeCallback');
    console.log(response);
    // The response object is returned with a status field that lets the
    // app know the current login status of the person.
    // Full docs on the response object can be found in the documentation
    // for FB.getLoginStatus().
    if (response.status === 'connected') 
      // Logged into your app and Facebook.
      testAPI();
     else if (response.status === 'not_authorized') 
      // The person is logged into Facebook, but not your app.
      document.getElementById('status').innerHTML = 'Please log ' +
        'into this app.';
     else 
      // The person is not logged into Facebook, so we're not sure if
      // they are logged into this app or not.
      document.getElementById('status').innerHTML = 'Please log ' +
        'into Facebook.';
    
  

更多参考可以参考官方文档的这个页面 https://developers.facebook.com/docs/facebook-login/login-flow-for-web/v2.0

【讨论】:

这似乎不起作用。在您的页面上进行简单的测试登录。运行 FB.getLoginStatus,并记下响应。在另一个选项卡中,退出 facebook,返回您的页面并重新运行命令 - 就 api 而言,您仍处于登录状态。刷新页面,重新运行 FB.getLoginStatus - 最后页面通知。 是的,它不会不断 ping fb 服务器以了解状态,但是当您调用 fb api 时,它会检查并以这种方式工作。 其实就是把你的FB.getLoginStatus改成多了一个参数true,就可以直接查询状态,解决问题。 请告诉我在哪里添加它,以便对其他人有用 我的做法是在我的“登录”点击处理程序中执行 FB.getLoginStatus(function() ... FB.login(...) ... , true),这似乎强制 statusChangedCallback 在登录调用期间成功查看更改。希望这是有道理的。【参考方案2】:

首先:为什么你到底想这样做?

Facebook 登录基本上只是为了方便 Facebook 用户避免在您的网页上填写注册或登录表单。它允许在您自己的网站上轻松设置用户会话,但据我所知,它没有任何权利让您直接从 Facebook 的会话中注销用户(也没有任何其他支持 Facebook 登录的网站,如 *** )。这也适用于相反的情况:如果用户退出 Facebook,这并不意味着他应该丢失通过 Facebook 登录建立的所有其他会话。

【讨论】:

以上是关于FB JS-SDK 无法检测到用户直接退出 FB的主要内容,如果未能解决你的问题,请参考以下文章

如何在不刷新页面的情况下使用 JS SDK 检测从 fb 注销

将 Parse 与 FB 集成连接起来

Android studio:无法检测到adb版本,退出值0xc0000135

手机浏览器检测到病毒无法下载

检测用户退出 Google Play 游戏登录

移动端检测微信浏览器返回,关闭,进入后台操作