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

Posted

技术标签:

【中文标题】如何在不刷新页面的情况下使用 JS SDK 检测从 fb 注销【英文标题】:how to detect log out from fb using JS SDK without refreshing the page 【发布时间】:2014-07-26 05:57:59 【问题描述】:

朋友们,

我正在开发一个网站,其中Facebook javascript API 用于向我们的朋友发送消息。

当用户退出fb时,弹出js API对话框时显示错误

"Refused to display 'https://www.facebook.com/login.php?api_key=0&skip_api_login=1&display=dialo…cale%3Den_US%26name%3DAnything%26to%3D1791715188%26from_login%3D1&rcount=1' in a frame because it set 'X-Frame-Options' to 'DENY'."

目前,我正在使用 FB.getLoginStatus 来检测用户是否已注销。但这仅适用于第一次,我无法动态检查它(这意味着当我退出 fb 帐户并返回同一窗口并尝试发送下一条消息而不刷新时,它会显示上述错误。)。

这里如何动态检测用户当前已注销。有什么方法可以在不刷新页面的情况下动态检查FB.getLoginStatus

我在下面显示我的代码。

$(document).ready(function()


window.fbAsyncInit = function() 
 FB.init(appId: '**************', xfbml: true, cookie: true,status:true,oauth:true);
  /*FB.Event.subscribe('auth.login', function() 
          //window.location.reload();
        );*/
     FB.Event.subscribe('auth.logout', function(response) 
    alert('logged out!');
    );
        ;

function facebook_send_message(to,name)   //function called when a button is clicked

 FB.getLoginStatus(function(response) 
    if (response.status === 'connected') 
        console.log('how to check');
         var uid = response.authResponse.userID;
        var accessToken = response.authResponse.accessToken;
        send_message(to,name);
    
    else if (response.status === 'not_authorized') 
            console.log('not_authorized');
        // the user is logged in to Facebook, 
        // but has not authenticated your app
    
    else
    
        console.log('hi');
         FB.login(function(response) 
           if (response.authResponse) 
           
                send_message(to,name);
                //getUserInfo(); // Get User Information.

             else
            
             console.log('Authorization failed.');
            
         ,scope: 'email');
    
);

send_message(to,name); 将在用户登录时发送消息, 目前第一次正常运行,但从第二次开始没有刷新页面,如果我们从fb注销,那么FB.getLoginStatus仍然显示response.status'connected',因此出现错误。

等待您的友好回复。 提前致谢

【问题讨论】:

【参考方案1】:

根据 Facebook,

https://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus/

为了提高应用程序的性能,并非每次检查用户状态的调用都会向 Facebook 的服务器发出请求。在可能的情况下,响应会被缓存。在当前浏览器会话中第一次调用 FB.getLoginStatus 或 JS SDK 以 status: true 初始化时,响应对象将被 SDK 缓存。对 FB.getLoginStatus 的后续调用将从这个缓存的响应中返回数据。

这可能会导致用户自上次完整会话查找后登录(或退出)Facebook 时出现问题,或者如果用户在其帐户设置中删除了您的应用程序。

为了解决这个问题,您调用 FB.getLoginStatus 并将第二个参数设置为 true 以强制往返 Facebook - 有效地刷新响应对象的缓存。

FB.getLoginStatus(function(response) 
  // this will be called when the roundtrip to Facebook has completed
, true);

【讨论】:

以上是关于如何在不刷新页面的情况下使用 JS SDK 检测从 fb 注销的主要内容,如果未能解决你的问题,请参考以下文章

在不刷新页面的情况下检测元掩码安装

如何在不刷新 vue.js 的情况下更新页面上的数据?

如何在不刷新页面的情况下使用 JavaScript 从 window.location (URL) 中删除哈希?

如何在不刷新页面的情况下使用 ajax 保存 acf_form

在不刷新页面的情况下将Youtube视频嵌入Angular JS的问题

如何在不刷新页面的情况下将数据从 Android 发送到 PHP 并显示