Facebook Javascript SDK getLoginStatus 返回未知(完全不一致)


Facebook Javascript SDK getLoginStatus Returning Unknown (completely inconsistently)

我正在使用PHP成功验证用户,获取访问令牌等。但是,对于我应用程序的一部分,我正在使用Javascript来加载图像/朋友等。过去我对getLoginStatus没有问题,但现在它又回来了。

status: unknown 

大约 80% 的时间。它似乎在 Firefox 中比其他浏览器工作得更好一些,但我仍然在那里发生它,所以我认为这只是一种侥幸。我能想到的唯一可能影响这一点的事情是在有人尝试使用 php 登录之前尝试注销以前的用户(但是我试图在没有它的情况下恢复文件并进行测试,但仍然不起作用,所以除非它以某种方式弄乱了我的持久数据我不知道):

$fb_key = 'fbsr_'.$facebookConfig['app_id'];
setcookie($fb_key, '', time()-3600);
$facebook->destroySession();

似乎在谷歌上找不到任何关于这个的东西,所以我真的不知道发生了什么。在这一点上,也许我只需要使用我通过 php 拥有的访问令牌通过 javascript api 进行查询(因为我仍然可以成功获得它)。我现在要研究一下,但与此同时,我想我会发布以防有人有任何想法!

这是我的JS代码:

window.fbAsyncInit = function() {
    FB.init({
        appId      : pre_fbAppID, // App ID
        channelUrl : pre_absURL + '/channel.html', // Channel File
        status     : true, // check login status
        cookie     : true, // enable cookies to allow the server to access the session
        xfbml      : true  // parse XFBML
    });
    doFacebookLogin();
    //Facebook can notify us when the user logs in and logs out
    FB.Event.subscribe('auth.login', function(response) {
        // do something with response
    });
    FB.Event.subscribe('auth.logout', function(response) {
        // do something with response
    });
    function doFacebookLogin(){
        FB.getLoginStatus(function(response) {
            checkLoginResponse(response);
        }, true);
    }

FB.getLoginStatus

the user is not logged into Facebook at this time and so we don't know if they've authenticated your application or not (unknown)

我认为您没有正确初始化您的 JS SDK 或在 FB.init 之前调用它。(同:此处)

你能发布关于FB.getLoginStatus的javascript块吗?

更新:为什么在FB.getLoginStatus中有"true"?

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

如果第一个调用返回 Unknown ->则所有其他调用将返回相同的调用。你能在没有"真实"的情况下尝试吗?

更新#2:

若要接收此调用的响应,必须订阅 auth.statusChange 事件。此事件传递的响应对象与显式调用 FB.getLoginStatus 返回的响应对象相同。

您订阅了除auth.statusChange之外的所有其他订阅

初始化:

window.fbAsyncInit = function () {
            FB.init({
                appId: 'xxxxxxxxxxxxx',
                cookie: true,
                xfbml: true,
                version: 'v2.2'
            });
            //FB.getLoginStatus(function (response) {
            //    statusChangeCallback(response);
            //});
        };

开始脸书登录:

function startFace() {
            FB.getLoginStatus(function (response) {
                statusChangeCallback(response);
            });
        }

通话状态:

function statusChangeCallback(response) {
            if (response.status === 'connected') {
                loginFacebook();
            } else if (response.status === 'not_authorized') {
                //some code
            } else if (response.status === 'unknown') {
                FB.login(function (response) {
                    statusChangeCallback(response);
                });
            } else {
                //some code
            }
            
        }