Facebook JS SDK FB.logout()不会终止用户会话

时间:2012-01-11 10:16:00

标签: javascript facebook facebook-javascript-sdk

我正在尝试使用Facebook JS SDK将用户从Facebook注销,但是请致电:

FB.logout(function(response){
    console.log(response);
});

返回: response.status ==“connected”

只有在刷新页面后,SDK才会意识到会话已经结束。有谁知道这可能导致什么行为?此代码以前在我的应用程序中工作,并且最近开始以这种方式运行。

使用FireBug的另一个例子:

enter image description here

10 个答案:

答案 0 :(得分:14)

https://developers.facebook.com/bugs/245362365535898?browse=search_4f112135664703a96454690 这是JS SDK中的一个错误,现在已经修复了,它应该推迟不会太久 在此之前,您可以执行以下操作

FB.logout(function(response) {
  FB.Auth.setAuthResponse(null, 'unknown');
  ...
});

答案 1 :(得分:3)

请参阅http://hustoknow.blogspot.com/2012/01/dealing-with-zombie-facebook-cookies.html

当您注销时,会向Facebook发送跨域请求以使会话无效。当你点击重新加载时,另一个请求被发送到Facebook的网站 - 因为FB认为cookie无效,它会正确地从你的浏览器中删除cookie。

我怀疑这是他们忘记解析最近一天左右推出的fbm_ cookie的一个正则表达式错误。我很惊讶没有推出这个修复程序。

答案 2 :(得分:3)

FB.logout(function(response) {
  ...
});

此FB.logout方法正常工作。 问题是用户试图从localhost调用它,这是无效的。

请尝试从服务器调用它。

答案 3 :(得分:2)

由于我花了很多时间来准确查找FB注销中发生的情况,因此最好在此处与他人共享。

第一件事,请阅读文档here

  

一个人登录Facebook,然后登录到您的应用程序。从您的应用程序注销后,该人仍将登录Facebook。

这一点杀死了我90%的时间。当我从facebook.com登录并尝试测试我的应用程序中的登录按钮时,它按预期工作,但注销并未终止会话。

解决方案或解决方案:根据文档中提供的方案,它不会终止用户会话,因为登录是从应用程序中未启动,是从facebook.com中。因此在这种情况下,fb不会终止会话。

当您从应用程序登录fb时(以用户名和密码重新登录),系统将会话的源/触发器视为您的应用程序。因此,当您注销(window.FB.logout或FB.logout)时,它将完全终止用户会话。

因此,请先从facebook.com中注销,然后再测试应用程序中的登录功能。

如前所述,请使用以下代码注销

FB.logout(function(response) {
 // response from logout will have authResponse with access_token so better to test the status as it will return "unknown"
 if(response.status !== "connected") { } \\ do some check on the status of the login before considering successful logout.
});

最后但并非最不重要:要从本地主机进行测试,请更新FB APP中的设置

  1. 应用程序域更新为 localhost
  2. 网站下的
  3. 网站URL http://localhost:3000/

这将解决从本地主机进行测试时遇到的问题

答案 4 :(得分:1)

我对FB.Logout()的工作方式与广告宣传不同。作为一种解决方法,我使用下面的javascript函数来检查用户是否已登录,如果是,则使用要加载的后续页面的URL及其访问令牌重定向到https://www.facebook.com/logout.php

    function reallylogout() {
      FB.getLoginStatus(function (response) {
        if (response.authResponse) {
           window.location = "https://www.facebook.com/logout.php?next=" +
             'URL to redirect to' +
             "&access_token=" + response.authResponse.accessToken;
        } else {
           $("#loginButtonDiv").show();
           $("#logoutButtonDiv").hide();
        }
      });
    }

show / hide位只是jQuery来显示或隐藏其中有登录和注销按钮的div。注销按钮的onclick会触发reallyLogout()函数。

这适用于我的应用。

答案 5 :(得分:1)

我遇到过类似的问题。我在Logout之后使用了FB.getLoginStatus()

答案 6 :(得分:0)

它在Facebook上显得破碎。在FB rell上你可以登录,但是注销功能什么都不做。 http://www.fbrell.com/auth/all-in-one

答案 7 :(得分:0)

好的,我找到了解决方案:

为此注销<a>标记设置onClick事件

onclick="FB.logout(function() { document.location.reload(); });"

所有在一起:

<a href="#" 
   id="auth-logoutlink"
   style="float:left;font-size: small;"
   onclick="FB.logout(function() { document.location.reload(); });">
   [logout]
</a>

答案 8 :(得分:0)

在asp.net mvc应用程序中我做了以下。


<a href="javascript:void(0);" class="logOff">Log out</a>

$(function () {


    $(".logOff").click(function () {

        //check if logout is 
        FB.getLoginStatus(function (response) {
            console.log('inside login status');
            if (response.status === 'connected') {
                // the user is logged in and has authenticated your
                // app, and response.authResponse supplies
                // the user's ID, a valid access token, a signed
                // request, and the time the access token 
                // and signed request each expire
                var uid = response.authResponse.userID;
                var accessToken = response.authResponse.accessToken;
                FB.logout(function (response) {

                    FB.Auth.setAuthResponse(null, 'unknown');

                });
            } else if (response.status === 'not_authorized') {
                // the user is logged in to Facebook, 
                // but has not authenticated your app

            } else {
                // the user isn't logged in to Facebook.
                console.log('response status not logged in');
            }
        });
        window.location.href = '@Url.Action("LogOff", "Account")';

    });

答案 9 :(得分:-1)

它可能不起作用,因为您不包含您的Facebook应用程序密钥。它对我有用:

 Ext.get('auth-logoutlink').on('click', function(){   
                  FB.getLoginStatus(function (response) {
                    if (response.authResponse) {
                       window.location = "https://www.facebook.com/logout.php?confirm=1&api_key=**MYAPIKEY**&next=" +
                         '**MYWEBSITEURL**' +
                         "&access_token=" + response.authResponse.accessToken;
                    } else {
                       //HIDE **LOGOUT BUTTON**
                       //SHOW **LOGIN BUTTON**
                    }
                  });
        });