2011-12-16 3 views
15

Я использую fb connect с помощью js. Это мой код:Функция обратного вызова входа FB не отвечает, если пользователь уже зарегистрирован в facebook

<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. Хотя, если пользователь уже зарегистрирован в facebook, тогда диалог fb открывается и закрывается. Затем он не передает управление ответчику. Я где-то читал, что force = "true" позволяет ему обнаруживать изменение статуса и переадресацию вызова. Но я не знаю, где добавить силу. Я думаю, что это должно быть в логине div. Это правда или есть какой-то другой подход?

спасибо вам.

+0

Я имеющей такой же проблемой. Я заметил, что если это приложение, связанное с пользователем, оно показывает это поведение. Пожалуйста помоги. –

+0

Я хочу вызвать событие (то же, что и после входа в систему) после нажатия кнопки входа в систему, если все готово для входа в приложение. –

+0

@SomnathMuluk Поскольку вы, кажется, используете fb login plugin, если пользователь входит в систему и уже подключен к вашему приложению, кнопка входа в систему [не будет показана] (https://developers.facebook.com/docs/reference/ плагины/логин /) (читайте здесь примечание). Вы можете подписаться на событие 'auth.statusChange' с помощью настраиваемой кнопки, если вы все еще хотите это сделать. Объяснил это в моем ответе. –

ответ

10

Метод 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 
}); 

Примечание Если вы используете фб кнопку Войти плагин, и пользователь уже вошел в систему и подключен к приложению, ни одна кнопка Логин не показывается (читать в документации here)

+0

Я бы проголосовал за метод 2! –

+0

Метод 1: синтаксические ошибки: 'invalid object initializer' – Richard

+0

@ Richard Edited. Нет ошибок. Он работает так, как ожидалось. –

2

Когда вы инициализируете 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 
+0

Я получаю статус входа в систему. Хотя, если пользователь уже зарегистрирован в facebook, тогда диалог fb открывается и закрывается. Затем он не передает управление обработчику ответа после нажатия кнопки входа. –

4

Я предложил бы позволить Facebook делать тяжелую работу за вас. Обратите внимание на некоторые изменения: 1. указанный channelUrl, 2. использование FB.getLoginStatus 3. удаление настройки файла cookie. 4. Изменение события для прослушивания (так в случае, если они зайдут в другом окне, или deauth приложение в другом месте, и т.д.)

<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> 
+0

Это вызовет после загрузки страницы. Я хочу позвонить после нажатия кнопки входа в систему. –

+0

Он будет вызывать кнопку входа в систему. См. Метод FB.Event.Subscribe. Опять же, таким образом, чтобы рама делала тяжелый подъем, а также согласно вашему требованию «*» auth.login 'в функции подписки имеет обработчик ответа, он вызывается только при нажатии пользователем на кнопку fb и еще не зарегистрированном в FB * " – DMCS

+0

+1 Очень мощный –

0

Вы должны заменить

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

с

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

Как auth.authStatusChange даже t при изменении статуса, независимо от того, вошли ли они в систему или авторизованы, указав учетные данные.

благодаря

+0

Когда я загружаю страницу входа, она будет напрямую перенаправляться на мою функцию. Я хочу, чтобы после нажатия кнопки входа он должен перейти к моей функции. –

+0

@SomnathMuluk Смотрите это: http://developers.facebook.com/docs/reference/javascript/FB.Event.subscribe/ Это просто событие для запуска любого изменения состояния, его до вас, как вы его используете, в auth.statusChange есть статус, который может быть подключен, авторизован или неизвестен, см. полную информацию по ссылке выше – Hafiz

1

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

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

+1

Я честно сделал, t с вашим кодом и FYI. Я использую эту строку, поэтому вы можете попробовать, если по какой-то причине это не исправит: FB.Event.subscribe ('auth.statusChange', ...) –

0

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

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

});