Подтвердить что ты не робот

Google+ signinCallback вызывается дважды и проигрывает authresult в процессе

В моем коде есть ошибка. Я могу войти и получить информацию о пользователе. Но signinCallback вызывается снова (я не знаю, как). И он показывает информацию о пользователе, которую я раньше ушел! Вот HTML-сторона:

<span id="signinButton">
    <span
        class="g-signin"
        data-callback="signinCallback"
        data-clientid="CLIENT_ID"
        data-cookiepolicy="single_host_origin"
        data-requestvisibleactions="http://schemas.google.com/AddActivity"
        data-scope="https://www.googleapis.com/auth/plus.profile.emails.read"
        data-width="standard"
        data-height="short">
    </span>
</span>

и вот сторона javascript:

var AuthStates = {
  google: null
};

function signinCallback(authResult) {
    console.dir(authResult);
    console.log('Sign-in state: ' + authResult['error']+authResult['access_token']);
    AuthStates.google = authResult;
    console.log('signinCallback');
    chooseAuthProvider();
}

function chooseAuthProvider() {
  if (AuthStates.google && AuthStates.facebook) {
    if (AuthStates.google['access_token']) {
      // Signed in with Google, you can now use Google+ APIs.
      console.log(AuthStates.google);
      gapi.client.load('plus','v1', function(){
        var request = gapi.client.plus.people.get({
          'userId': 'me'
        }); 
        request.execute(function(resp) {
          document.getElementById('cname').value =resp.displayName;
          document.getElementById('cemail').value =resp.emails[0].value;
          console.log('Retrieved profile for:' + resp.displayName + ' ' + resp.emails[0].value);
        });
      });
}
}

Он дает этот ответ консоли на втором signinCallback

Sign-in state: user_signed_outundefined
signinCallback

Result of console.dir(authResult)

4b9b3361

Ответ 1

Ваш вызов метода request.execute() в вашем методе обратного вызова вызывает повторный запуск метода обратного вызова с использованием значения "user_signed_out" в свойстве error.

Если вы посмотрите документацию Google "Выйти из системы" , она гласит:

Когда пользователь обновляет страницу или переходит к другой части вашего сайта, обратный вызов будет срабатывать с использованием значения user_signed_out в error, пока пользователь еще не нажмет кнопку входа.

Следовательно, я считаю, что это ваш запрос request.execute(), который вызывает второй вызов метода обратного вызова.

Вы можете защитить этот второй вызов от обратного вызова, поместив условие в метод обратного вызова, например.

function signinCallback(authResult) {
 if (authResult['status']['signed_in']) {
  console.dir(authResult);
  console.log('Sign-in state: ' + authResult['error']+authResult['access_token']);
  AuthStates.google = authResult;
  console.log('signinCallback');
  chooseAuthProvider();
 }
}

См. документацию Google по Мониторинг состояния сеанса пользователя для примера ранее упомянутых условий защиты.

Ответ 2

Это может быть полезно для вас

(функция() {   var GOOGLE_PLUS_SCRIPT_URL = 'https://apis.google.com/js/client:plusone.js';

 window.oauth2Callback = function(authResult) {
 if (authResult['access_token']) {
  accessToken = authResult['access_token'];
  $(function() {
$.getScript(GOOGLE_PLUS_SCRIPT_URL);}