Как определить выход пользователя из Facebook после входа в мое приложение?

Мое приложение использует аутентификацию Facebook:

FB.init({

    appId: config.fbAppId,
    status: true,
    cookie: true,
//  xfbml: true,
//  channelURL : 'http://WWW.MYDOMAIN.COM/channel.html', // TODO
    oauth  : true

});

// later...

FB.login(function(response)
{
    console.log(response);
    console.log("authId: " + response.authResponse.userID);
    gameSwf.setLoginFacebook(response.authResponse.accessToken);
}, {scope:'email,publish_actions,read_friendlists'});

И, используя его, люди могут писать на стене:

var obj = {
      method: 'feed',
      link: linkUrl,
      picture: pictureUrl,
      name: title,
      caption: "",
      description: message
    };

    function callback(response) {
      // console.log("Post on wall: " + response);
    }

    FB.ui(obj, callback);

Это отлично работает, но есть один маленький сбой. Если люди:

  1. Войдите в приложение.
  2. Выйти из Facebook.
  3. Попытайтесь сделать настенный пост из приложения.

Открытие диалогового окна сообщения на стене не удается. На консоли написано "Отказ от отображения документа, потому что отображение запрещено X-Frame-Options.".

Могу ли я вместо этого заставить Facebook показывать пользователю приглашение на вход? Или я могу обнаружить ошибку и сказать пользователю, что он больше не вошел в Facebook?

2 ответа

Решение

Просто вспомните getLoginStatus, НО заставлял вас отправляться в Facebook. Посмотрите следующий код:

FB.getLoginStatus(function(response) {
  // some code
}, true);

Посмотрите на последний параметр, установленный в true, чтобы принудительно совершить круговое движение.

Из документации JS SDK:

Чтобы повысить производительность вашего приложения, не каждый звонок для проверки статуса пользователя приведет к запросу на серверы Facebook. Где возможно, ответ кэшируется. В первый раз в текущем сеансе браузера вызывается FB.getLoginStatus, или JS SDK инициируется с помощью status: true, объект ответа будет кэшироваться SDK. Последующие вызовы FB.getLoginStatus вернут данные из этого кэшированного ответа.

Это может вызвать проблемы, когда пользователь вошел в (или нет) Facebook с момента последнего полного просмотра сеанса или если пользователь удалил ваше приложение в настройках своей учетной записи.

Чтобы обойти это, вы вызываете FB.getLoginStatus со вторым параметром, установленным в true, чтобы принудительно совершить обратную передачу в Facebook - эффективно обновляя кэш объекта ответа. ( http://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus/)

То, что вы можете попробовать и использовать - это FB.getLoginStatus, где, если пользователь подключен, это позволит ему завершить запись на стене. Если они не подключены, вызовите метод FB.login, прежде чем они смогут публиковать сообщения на стене.

FB.getLoginStatus(function(response) {
    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;
    } 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.
    }
});

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

Есть также события для входа в систему и выхода из системы, которые вы можете наблюдать и что-то делать с этими ответами.

FB.Event.subscribe('auth.login', function(response) {
    // do something with response
});

FB.Event.subscribe('auth.logout', function(response) {
    // do something with response
});

http://developers.facebook.com/docs/reference/javascript/FB.Event.subscribe/

Другие вопросы по тегам