Функция обратного вызова входа FB не отвечает, если пользователь уже зарегистрирован в facebook
Я использую fb connect с помощью js. Это мой код:
<script>
window.fbAsyncInit = function() {
FB.init({
appId : 'xxxxxxxxxxxxxxxx',
status : true,
cookie : true,
xfbml : true,
oauth : true
});
FB.Event.subscribe('auth.login', function(response) {
obj=response.authResponse;
token=obj.accessToken;
setCookie("access_token_fb", token, '2');
window.location.reload();
},true);
};
(function(d){
var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
js = d.createElement('script'); js.id = id; js.async = true;
js.src = "//connect.facebook.net/en_US/all.js";
d.getElementsByTagName('head')[0].appendChild(js);
}(document));
</script>
для входа я использую:
<div class="fb-login-button" scope="email,user_checkins" >Login with Facebook</div>
'auth.login' в функции подписки имеет обработчик ответа, который вызывается только тогда, когда пользователь нажимает кнопку fb и еще не входит в FB, вводит свой адрес электронной почты и пароль в окне fb. Хотя, если пользователь уже зарегистрирован в facebook, тогда диалог fb открывается и закрывается. Затем он не передает управление ответчику. Я где-то читал, что force = "true" позволяет ему обнаруживать изменение статуса и переадресацию вызова. Но я не знаю, где добавить силу. Я думаю, что это должно быть в логине div. Это правда или есть какой-то другой подход?
спасибо за ваше время.
Ответы
Ответ 1
Метод 1:
Хотя я считаю, что DMCS дал правильное решение проблемы, вот еще один способ подхода. Используйте метод FB.login с пользовательской ссылкой для входа.
<script>
window.fbAsyncInit = function() {
FB.init({
appId: 'YOUR-APP-ID',
status: true,
cookie: true,
xfbml: true,
oauth: true
});
};
function facebookLogin() {
FB.login(function(response) {
if (response.authResponse) {
console.log('Authenticated!');
// location.reload(); //or do whatever you want
} else {
console.log('User cancelled login or did not fully authorize.');
}
},
{
scope: 'email,user_checkins'
});
}
(function(d) {
var js,
id = 'facebook-jssdk';
if (d.getElementById(id)) {
return;
}
js = d.createElement('script');
js.id = id;
js.async = true;
js.src = "//connect.facebook.net/en_US/all.js";
d.getElementsByTagName('head')[0].appendChild(js);
} (document));
</script>
Разметка тела:
<div id='fb-root></div><!-- required for SDK initialization -->
<a id='fb-login' href='#' onclick='facebookLogin()'>Login with Facebook</a>
Когда вы нажмете на кнопку, она запустит функцию обратного вызова внутри FB.login.
Метод 2:
В качестве альтернативы, используя плагин для входа в систему FB, вы можете подписаться на auth.statusChange
и проверить статус пользователя в ответ.
FB.Event.subscribe('auth.statusChange', function(response) {
// check for status in the response
});
Обратите внимание, что если вы используете плагин для входа в систему fb, и пользователь уже зарегистрирован и подключен к приложению, кнопка входа в систему не отображается (читайте в документации здесь)
Ответ 2
Я предлагаю позволить Facebook сделать тяжелый подъем для вас.
Обратите внимание на некоторые изменения: 1. channelUrl указан, 2. использование FB.getLoginStatus 3. удаление настройки файла cookie. 4. изменение события для прослушивания (в случае, если они выходят из системы в другом окне или в другом приложении и т.д.)
<script>
window.fbAsyncInit = function() {
FB.init({
appId : 'xxxxxxxxxxxxxxxx',
status : true,
cookie : true,
xfbml : true,
oauth : true,
channelUrl : '//WWW.YOUR_DOMAIN.COM/channel.html' // Channel File
});
FB.getLoginStatus(function(response) {
if (response.status === 'connected') {
var uid = response.authResponse.userID;
var accessToken = response.authResponse.accessToken;
// Do something with the access token
} else {
// Subscribe to the event 'auth.authResponseChange' and wait for the user to autenticate
FB.Event.subscribe('auth.authResponseChange', function(response) {
// nothing more needed than to reload the page
window.location.reload();
},true);
// now dynamically show the login plugin
$('#mydiv').show();
}
});
};
(function(d){
var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
js = d.createElement('script'); js.id = id; js.async = true;
js.src = "//connect.facebook.net/en_US/all.js";
d.getElementsByTagName('head')[0].appendChild(js);
}(document));
</script>
Ответ 3
Когда вы инициализируете FB SDK с помощью status:true
, он будет получать статус входа пользователя и сохранять его. С этого момента, когда вы делаете вызовы на FB.getLoginStatus()
, он не получает доступ к извлечению последних данных из FB, а вместо этого относится к локально сохраненным переменным, которые были установлены в точке FB.init()
- я думаю, что он обновляется только каждые 20 минут (см. https://github.com/facebook/facebook-js-sdk/commit/5b15174c7c9b9ea669499804d4a4c7d80771b036) - однако вы можете принудительно обновить, выполнив следующее:
FB.getLoginStatus(function() {...}, /*FORCE*/ true);
Затем следует запустить ваше событие auth.login
или просто передать обработчик, который вы определили для этого события, на FB.getLoginStatus
.
Можно даже пойти дальше и опросить эту функцию, например:
setTimeout(function() {
FB.getLoginStatus(function() {...}, /*FORCE*/ true);
}, 10000); // poll every 10 seconds
Ответ 4
Измените "status: true" на "status: false", и я верю, что он сделает то, что вы хотите. Проблема заключается в статусе: true делает проверку статуса на init, поэтому нет ничего, что можно изменить, когда пользователь нажимает кнопку.
Найден ответ на следующий комментарий здесь: http://www.bubblefoundry.com/blog/2011/03/the-facebook-login-button-and-logging-into-your-webapp/
Ответ 5
Вам нужно заменить
FB.Event.subscribe('auth.authResponseChange', function(response){
с
FB.Event.subscribe('auth.statusChange', function(response){
Как auth.authStatusChange триггер события при изменении статуса, независимо от того, вошли ли они в систему или авторизованы, указав учетные данные.
спасибо
Ответ 6
Это работает:
FB.getLoginStatus(function(response) {
//only works when page loads, use FB.Event.subscribe for status change
statusChangeCallback(response);
FB.Event.subscribe('auth.statusChange', function(response){
//yay! do whatever here, there was a status change
},true);
});