Как определить выход пользователя из 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);
Это отлично работает, но есть один маленький сбой. Если люди:
- Войдите в приложение.
- Выйти из Facebook.
- Попытайтесь сделать настенный пост из приложения.
Открытие диалогового окна сообщения на стене не удается. На консоли написано "Отказ от отображения документа, потому что отображение запрещено 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/