Как определить, что пользователь вышел из Facebook после входа в мое приложение? - PullRequest
3 голосов
/ 28 февраля 2012

Мое приложение использует аутентификацию 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 ]

4 голосов
/ 26 апреля 2013

Просто вспомните 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/)

2 голосов
/ 28 февраля 2012

То, что вы можете попробовать и использовать, это 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/

...