FB.logout() 在没有访问令牌的情况下调用

IT技术 javascript facebook facebook-javascript-sdk
2021-02-18 06:21:47

我正在尝试退出我创建的与 Facebook 集成的网站。登录工作正常,但是当我想注销 Firebug 时,始终会出现以下错误:

FB.logout() 在没有访问令牌的情况下调用。

我正在使用 Facebook JavaScript SDK,我必须注销的代码如下所示:

$(document).ready($(function () {
    $("#fblogout").click(facebooklogout);
}));

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

这是Facebook 开发人员文档中指定的注销代码,只是一个按钮被分配了 document.ready 上的方法

在此代码之前,我有FB.init()方法,一切正常。

如果有人有关于为什么 FB.logout 没有访问令牌的解决方案,我们将不胜感激。

6个回答

要从使用 facebook 图形 API 的应用程序注销,请在<form>标记后的注销页面上使用此 JavaScript

window.onload=function()
{
    // initialize the library with your Facebook API key
    FB.init({ apiKey: 'b65c1efa72f570xxxxxxxxxxxxxxxxx' });

    //Fetch the status so that we can log out.
    //You must have the login status before you can logout,
    //and if you authenticated via oAuth (server side), this is necessary.
    //If you logged in via the JavaScript SDK, you can simply call FB.logout()
    //once the login status is fetched, call handleSessionResponse
    FB.getLoginStatus(handleSessionResponse);
}

//handle a session response from any of the auth related calls
function handleSessionResponse(response) {
    //if we dont have a session (which means the user has been logged out, redirect the user)
    if (!response.session) {
        window.location = "/mysite/Login.aspx";
        return;
    }

    //if we do have a non-null response.session, call FB.logout(),
    //the JS method will log the user out of Facebook and remove any authorization cookies
    FB.logout(handleSessionResponse);
}

该代码有效并且在我的网站上可用。

比尔 我只是想知道您的解决方案是否会创建某种循环,因为方法 handleSessionResponse 是从自身内部调用的。(只是为了让您了解技能和理解力,我是初级开发人员,只学习了 6 个月。)
2021-04-22 06:21:47
棘手的事情。谢谢。在尝试您的解决方案之前遇到同样的问题。
2021-04-22 06:21:47
巧妙的把戏。通过做相同类型的事情(循环调用 FB.logout() 直到会话真正被破坏),我能够为我自己的应用程序采用此代码
2021-05-06 06:21:47
是的,马丁。你是绝对正确的。该函数是递归的,并在会话返回空值之前一直被调用。递归方法背后的想法是它应该继续向 facebook 发送“注销”请求,直到 facebook 上的用户会话被实际销毁;因为我的测试表明,每次向 facebook 发出单个“注销”请求都不起作用(可能是 fb api 错误)。上面的代码只是为了确保用户注销。如果您可以编写一个重用上述代码的非递归方法并将其发布为 SO 用户参考的替代方法,我将不胜感激
2021-05-15 06:21:47
感谢 Shadow 格式化我的代码。请注意,您需要将此 HTML 放在 <form> 标记之后和 javascript 之前 - <div id="fb-root">
2021-05-17 06:21:47

我选择了不那么琐碎的解决方案:

    function facebookLogout(){
        FB.getLoginStatus(function(response) {
            if (response.status === 'connected') {
                FB.logout(function(response) {
                    // this part just clears the $_SESSION var
                    // replace with your own code
                    $.post("/logout").done(function() {
                        $('#status').html('<p>Logged out.</p>');
                    });
                });
            }
        });
    }
您的代码如果错误,如果用户未与 Facebook 连接,您仍希望将他与您的站点断开连接(例如post('/logout')
2021-04-26 06:21:47
@Dorian 哦,对了,反正我只是在清除会话(没有人喜欢 fb 注销功能将他们从 Facebook 注销 - 以及应用程序)
2021-04-30 06:21:47
我的意思是,如果有人点击“注销”按钮,即使他们没有登录到 Facebook,你也想清除他们的会话:gist.github.com/Dorian/f65a976f6b08739dcf83
2021-05-03 06:21:47
@Dorian 如果他们隐式登录,它只会将他们从 facebook 注销,即他们从应用程序的登录流程登录到 facebook,而不是通过他们从 facebook.com 登录
2021-05-09 06:21:47
@dorian 谢谢,但那是我自己的代码,不,这没有错。我清楚地在上面写了“用你自己的代码替换”。Ps 你不能在没有看到在mydomain.com/logouturl 中执行的代码的情况下做出判断
2021-05-10 06:21:47

试了好多次才搞定。

一般response.authResponse.accessToken包含token。因此,它关于 accessToken 不存在的错误。

从逻辑上思考,该响应来自您的代码中的哪里?从哪儿冒出来。

因此,我们需要从函数中获取该响应对象并使其正常工作。我不知道它对其他人如何,但这对我有用。

只需用这个替换代码

function logout(){
  FB.getLoginStatus(function(response) {
    FB.logout(function(response){
      console.log("Logged Out!");
      window.location = "/";
    });
  });
}

我们在这里做的是,如果用户已登录,则获取登录状态并返回相应的响应,其中包含所有必要的令牌和数据。获取此信息后,该令牌将用于注销用户。

在调用 FB.logout 之前,我还检查了 response.authResponse 中是否有任何内容
2021-04-29 06:21:47
是的!这增加了另一层预防措施。
2021-05-09 06:21:47
这如何“将响应传递给注销功能”?回调函数参数中的响应FB.logout应该在注销后由 FB API 传递...
2021-05-16 06:21:47

我试过这样的事情:

function fbLogout(){
    if(typeof FB.logout == 'function'){
        if (FB.getAuthResponse()) {
         FB.logout(function(response) { window.location.href = PROJECT_PATH + '/index/logout'; }); 
         return;
        }  
    };

    window.location.href = PROJECT_PATH + '/index/logout'; 
    return;  
}

应该更像这样。JS API 发生了变化,您必须使用 authResponse 而不仅仅是会话。

//handle a session response from any of the auth related calls
function handleSessionResponse(response) {

    //if we dont have a session (which means the user has been logged out, redirect the user)
    if (!response.authResponse) {
        return;
    }

    //if we do have a non-null response.session, call FB.logout(),
    //the JS method will log the user out of Facebook and remove any authorization cookies
    FB.logout(response.authResponse);
}
最后一行没有意义,你需要传递一个回调函数(如果你愿意)但为什么传递响应本身?FB.logout()就够了。handleSessionResponse无论如何都会调用该函数?这是什么玄机response上面的答案澄清了这一点。
2021-05-15 06:21:47