FB.logout:在以后调用FB.getLoginStatus时应该怎么做?

时间:2017-10-01 16:09:49

标签: javascript facebook-javascript-sdk

根据https://developers.facebook.com/docs/reference/javascript/FB.logout/

  

方法FB.logout()将用户从您的网站中记录

这对后来调用FB。*函数意味着什么?

具体来说,我观察到即使对FB.logout的响应状态为" unknown",在注销完成后,调用FB.getLoginStatus返回状态为&#34 ; connect",将true作为第二个参数传递或在页面刷新后传递。

这对我来说是意料之外的......也许我误解了用户将用户从您的网站中删除的内容"意思是:就FB。*功能而言,它意味着什么?我希望尽可能地扭转FB.login的过程。怎么办呢?

更新:我正在http://localhost:8080进行测试。当在http://fbtest.charemza.name/上时,我意识到注销按预期工作,但注销localhost:8080注销似乎有效,即表现出上述问题。要清楚,控制台中任何时候都不会出现错误。该页面的代码如下。

要稍微更改问题,为什么在localhost:8080上执行此操作,是否有办法在本地开发注销,其行为与公共网络上的行为相同?

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Facebook Test</title>
</head>

<body>
  <script>
    window.fbAsyncInit = function() {
      FB.init({
        appId      : '1524395480985654',
        cookie     : true,
        xfbml      : false,
        status     : false,
        version    : 'v2.10'
      });

      FB.AppEvents.logPageView();   
    };

    (function(d, s, id){
       var js, fjs = d.getElementsByTagName(s)[0];
       if (d.getElementById(id)) {return;}
       js = d.createElement(s); js.id = id;
       js.src = "https://connect.facebook.net/en_US/sdk.js";
       fjs.parentNode.insertBefore(js, fjs);
     }(document, 'script', 'facebook-jssdk'));

    document.addEventListener("DOMContentLoaded", function(event) {
      document.getElementById("loginButton").addEventListener("click", function() {
        FB.login(function(response) {
          console.log('FB.login', response);
        });

      });

      document.getElementById("logoutButton").addEventListener("click", function() {
        FB.logout(function(response) {
          console.log('FB.logout', response);
        });
      });

      document.getElementById("getLoginStatusButton").addEventListener("click", function() {
        FB.getLoginStatus(function(response) {
          console.log('FB.getLoginStatus', response);
        }, true);
      });
    });
  </script>


  <button id="loginButton">FB.login()</button>
  <button id="logoutButton">FB.logout()</button>
  <button id="getLoginStatusButton">FB.checkLoginStatus()</button>
</body>
</html>

2 个答案:

答案 0 :(得分:3)

这在localhost上不起作用的原因是您已将应用域设置为localhost,只有在使用实际域时才应设置应用域。

所以我在FB JSSDK加载的Javascript上进行了调试会话,发现在

行下面
document.cookie = n + "=" + o + (o && p === 0 ? "" : "; expires=" + r) + "; path=/" + (q ? "; domain=" + j : "")

如果没有App domains设置,则设置为q=nullj=.localhost。所以没有在cookie上设置域名,因此一切都很好。

App domains设置为localhostq=truej=.localhost时。因此,当代码尝试设置域时,它使用类似下面的内容

  

&#34; fbsr_370363483399260 = q8i_dn0F22UweXRMNff0tf5WpfYOelZ0vsjtIKrDhzw.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI .... A4NTgwNzg1MzEwOTk5In0; expires =星期五,2017年10月13日14:00:01 GMT;路径= /;域= .localhost&#34;

这不适用于localhost,并且根本不允许设置cookie。 document.cookie不会设置任何与当前页面无关的cookie。但是如果我在控制台中覆盖j=localhost,那么cookie就可以运行。这是您在本地测试时不应将App domain设置为localhost的原因

FB Cookies on local

答案 1 :(得分:0)

  

方法FB.logout()将用户从您的站点中注销,在某些情况下   案例,Facebook。

这意味着:

  1. 步骤:用户未登录Facebook - &gt;登录您的应用

    在FB.Logout上:用户将从您的应用和Facebook注销

  2. 步骤:用户未登录Facebook - &gt;登录其他应用。 - &GT;登录您的应用

    在FB.Logout上:用户将从应用和Facebook注销

  3. 步骤:用户已登录Facebook - &gt;登录您的应用

    在FB.Logout上:用户将从您的应用中注销,但不会从Facebook注销。

  4. (注意:如果用户未登录Facebook,他/她将首先登录Facebook然后登录您的应用程序)

    因此,在所有情况下,用户都必须使用facebook登录,因此当您使用FB.getLoginStatus时会发生以下情况:

    1. 用户登录Facebook,您的应用已通过身份验证。

      FB.getLoginStatus返回已连接

    2. 用户登录Facebook但未对您的应用进行身份验证

      FB.getLoginStatus返回 not_authorized

    3. 现在,如果用户退出Facebook或退出您的应用程序(这可能会导致从Facebook注销)。 (这似乎是你的情况) 因为在这种情况下,应用甚至没有尝试连接到Facebook,这就是为什么未知。

      FB.getLoginStatus返回 unknown

    4. 编辑:

      现在在第三种情况下,它总会返回未知,因为它甚至没有尝试连接到Facebook。因此,如果你传递强制true,它将尝试对Facebook进行ajax调用并返回状态(应该连接或未经授权)。

      function getLoginStatus(cb, force) {
        if (!Runtime.getClientID()) {
          Log.warn('FB.getLoginStatus() called before calling FB.init().');
          return;
        }
        if (cb) {
          if (!force && loadState == 'loaded') {
            cb({
              status: Runtime.getLoginStatus(),
              authResponse: getAuthResponse()
            });
            return;
          } else {
            Auth.subscribe('FB.loginStatus', cb);
          }
        }
        if (!force && loadState == 'loading') {
          return;
        }
        loadState = 'loading';
        var lsCb = function lsCb(response) {
          loadState = 'loaded';
          Auth.inform('FB.loginStatus', response);
          Auth.clearSubscribers('FB.loginStatus');
        };
        fetchLoginStatus(lsCb);
      }
      

      如果force为true,则从Facebook SDK获取的上述函数将fetchLoginStatus。