Функция обратного вызова входа 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:

Хотя я считаю, что 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, и пользователь уже вошел в систему и подключился к нему, кнопка входа в систему не отображается (читайте здесь в документации)

Я предлагаю позволить 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> 

Когда вы инициализируете FB SDK со status:true он получит статус входа пользователя и сохранит его. С этого момента, когда вы делаете вызовы FB.getLoginStatus() он не 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 

Измените «status: true» на «status: false», и я верю, что он сделает то, что вы хотите. Проблема заключается в статусе: true делает проверку статуса происшедшей в init, поэтому нет ничего, что можно было бы изменить, когда пользователь нажмет кнопку.

Найден ответ на следующий комментарий здесь: http://www.bubblefoundry.com/blog/2011/03/the-facebook-login-button-and-logging-into-your-webapp/

Вам нужно заменить

 FB.Event.subscribe('auth.authResponseChange', function(response){ 

с

 FB.Event.subscribe('auth.statusChange', function(response){ 

Поскольку триггер события auth.authStatusChange при изменении статуса уже зарегистрирован или зарегистрирован, указав учетные данные.

благодаря

Это работает:

 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); });