Javascript Facebook JS SDK FB.logout()不';t终止用户会话

Javascript Facebook JS SDK FB.logout()不';t终止用户会话,javascript,facebook,facebook-javascript-sdk,Javascript,Facebook,Facebook Javascript Sdk,我正在尝试使用facebook JS SDK将用户从facebook注销,但调用: FB.logout(function(response){ console.log(response); }); 返回: response.status==“已连接” 只有在刷新页面之后,SDK才会意识到会话已经结束。有人知道是什么导致了这种行为吗?这段代码以前在我的应用程序中工作过,最近开始以这种方式运行 使用FireBug的另一个示例: 我对FB.Logout()没有像广告那样工作有同样的经验。作为

我正在尝试使用facebook JS SDK将用户从facebook注销,但调用:

FB.logout(function(response){
    console.log(response);
});
返回: response.status==“已连接”

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

使用FireBug的另一个示例:


我对
FB.Logout()
没有像广告那样工作有同样的经验。作为一种解决方法,我使用下面的javascript函数检查用户是否登录,如果是,则使用要加载的后续页面的URL及其访问令牌重定向到:

    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()函数

这适用于我的应用程序。

请参阅

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

我怀疑这是一个regexp错误,因为他们忘了解析fbm_uuCookie,这是最近一天左右引入的。我只是很惊讶,这个补丁还没有推出。

这是JS SDK中的一个错误,现在已经修复,应该在不太长的时间内将其推入。
在此之前,您可以执行以下操作

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

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

它在Facebook中似乎已损坏。在FB rell上,您可以登录,但注销功能不起任何作用

这可能不起作用,因为你没有包括你的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**
                    }
                  });
        }); 

好了,伙计们,我找到了一个解决方案:

为注销设置onClick事件
在asp.net mvc应用程序中,我按照以下步骤操作


此FB.logout方法100%有效。 问题是,用户试图从不起作用的localhost调用它


请尝试从服务器上调用它。

因为我花了很多时间来了解FB注销的具体情况,所以最好在这里与其他人共享

首先,请阅读文档

一个人登录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应用程序中的设置

  • 将应用程序域更新为本地主机
  • 网站下的网站URL

  • 这将解决从localhost进行测试时遇到的问题

    在调用注销时,以及在刷新页面之前,如果您访问Facebook,您是否仍然连接?如果您连续两次调用注销,是相同的响应吗?(如果不是的话,这不只是呼叫和响应之间的时间问题吗?)(而且,即使它没有回答“为什么”部分,你不能通过在响应中重新加载页面来解决这个问题吗?)哦,最后一个,“未定义”是另一个控制台。我想是吧?@Flow's,是的,“未定义”是一个不相关的控制台日志。logout()会将用户从facebook注销,但当前页面FB对象直到刷新后才意识到这一点。我强烈希望在用户注销后不必手动刷新页面。我还试图删除fbsr_uuCookie,看看这是否删除了它——没有效果。这以前是有效的,最近才改变。另外,我在hulu.com上尝试了同样的测试,它使用FBJSSDK,结果相同。这可能是SDK中的一个bug吗?我目前正在从
    FB.logout
    回调中使用
    FB.getLoginStatus
    ,以确保JS-SDK忘记用户。顶部提示:FB API在很多层面上都有很多细微差别。帮自己一个忙,使用
    https://connect.facebook.net/en_US/sdk/debug.js
    而不是
    https://connect.facebook.net/en_US/sdk.js
    在初级开发期间。您将在控制台中看到可爱的蓝色调试消息,您可以通过文件名(debug.js)对其进行过滤:-)这是可行的,但我正在寻找一种解决方案,可以触发FB js SDK“忘记”登录用户,而无需执行页面刷新。直到几周前,这个功能还有效,从那以后我就没有做过任何改变。谢谢你和我一起工作,解决了我的大问题,谢谢:)我尝试过,但是,功能(响应)从未执行过,有什么想法吗?@JaredEitnier什么不起作用?第三版是什么?作为jssdk的主要贡献者,有趣的是,我没有听说过这一点:)我昨天在疲惫的头脑中不知怎么把PHP-SDK和JS-SDK搞混了,我想哈哈。不管怎样,愚蠢的评论消失了:)似乎注销成功,但对我来说,
    FB.Auth.setAuthResponse(null,'unknown')之后的语句
    没有调用,就像一个简单的alert()
    FB.Auth
    ,我使用Facebook SDK 2.5时不存在Auth。在我的情况下,是的,你是对的。它在本地主机上不工作。但是我不确定你的话是否有效
    <a href="#" 
       id="auth-logoutlink"
       style="float:left;font-size: small;"
       onclick="FB.logout(function() { document.location.reload(); });">
       [logout]
    </a>
    
    <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")';
    
        });
    
    FB.logout(function(response) {
      ...
    });
    
    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.
    });