Вход в Google дважды попадает в систему?

Я использую Google Login через JS, и, похоже, мой код дважды получает данные. Я не уверен, почему это происходит.

Когда я нажимаю кнопку «Войти через Google», он выводит (console.log (результат)) данные для пользователя. ТОГДА появляется запрос с просьбой выбрать мою учетную запись (я вошел в несколько учетных записей Google). Когда я нажимаю на нужную учетную запись, код снова выводит эти пользовательские данные.

Почему это происходит? Это проблема, потому что там, где я выплевываю данные, я хотел бы сделать вызов ajax, чтобы проверить пользователя, а затем перенаправить его. По сути, он пытается сделать это дважды - что не круто, что, если я не хочу входить в систему, используя учетные данные, которые Google передает обратно при первом обходе?

(function() {
   var po = document.createElement('script');
   po.type = 'text/javascript'; po.async = true;
   po.src = 'https://apis.google.com/js/client:plusone.js';
   var s = document.getElementsByTagName('script')[0];
   s.parentNode.insertBefore(po, s);
 })();

function googleLogin() {
    var additionalParams = {
        'callback': googleCallback
    };

    gapi.auth.signIn(additionalParams);
}

function googleCallback(authResult) {
    if (authResult['status']['signed_in']) {
        gapi.client.load('oauth2', 'v2', function() {
            gapi.client.oauth2.userinfo.get().execute(function(resp) {
                console.log(resp);
            })
        });
    } else {
        console.log('Sign-in state: ' + authResult['error']);
    }
}

Обновление: если я выйду из всех своих учетных записей Google (за исключением одной и только одной), вызов Google все равно будет дублироваться. На этот раз он входит в систему, и я вижу, что console.log () дважды выводит данные. Жетоны доступа идентичны.

Обновление 2: console.log (соответственно) выводится дважды

Обновление 3: дополнительные пояснения:

firebug


comment
Что вы видите, выводится дважды? console.log (соответственно); или console.log ('Состояние входа:' + authResult ['error']) ;; Полагаю, это позже?   -  person Ben Smith    schedule 14.04.2014
comment
console.log (соответственно); информация о пользователе дважды. В моем исходном сообщении сначала это пользователь по умолчанию. А затем информация о пользователе выбранного ими аккаунта. В моем обновлении это значение по умолчанию дважды.   -  person Mike    schedule 14.04.2014
comment
Когда я следовал руководству здесь developers.google.com/+/web/signin/ javascript-flow, но использовал ваш код в gapi.client.load, console.log (соответственно); вызывается только один раз.   -  person Ben Smith    schedule 15.04.2014
comment
Так странно. и когда вы пытались, вы уже вошли в несколько учетных записей Google?   -  person Mike    schedule 15.04.2014
comment
Беру обратно. console.log (соответственно); вызывается дважды, и это действительно странно. Я получаю это, когда впервые запускаю страницу с примером. Я получаю двойной звонок, когда появляется небольшой прямоугольный баннер с приветствием. Второй раз нажимаю на кнопку один раз регистрируется. Я опубликовал ответ, который может помочь.   -  person Ben Smith    schedule 16.04.2014
comment
Ага, ты прав. Он вызывается дважды, даже если я заменю вызов gapi.client.load простым журналом консоли (поэтому я удалил свой ответ). Действительно, очень странно. Это происходит только тогда, когда появляется прямоугольное приветствие, после этого console.log вызывается только один раз.   -  person Ben Smith    schedule 16.04.2014
comment
Спасибо, что посмотрели это. Не могу, хоть убей, обдумать это.   -  person Mike    schedule 16.04.2014
comment
Нет проблем. Я сбит с толку, как и ты. Я тоже хочу разобраться в проблеме. Я вернусь к вам, если узнаю. По крайней мере, вы не одиноки в своих выводах!   -  person Ben Smith    schedule 16.04.2014
comment
Нашел ответ! См. Мой не удаленный ответ.   -  person Ben Smith    schedule 16.04.2014


Ответы (2)


Вы столкнулись с двумя вызовами "console.log (resp);" в функции "googleCallback", потому что:

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

Эта цитата взята с веб-страницы «Мониторинг состояния сеанса пользователя» .

Как видно из статьи, объект результата авторизации имеет три различных значения статуса "метод":

  • нулевой
  • БЫСТРЫЙ
  • АВТО

Таким образом, ваш код обратного вызова запускается, когда появляется приглашение входа в систему («ЗАПРОС») и когда появляется баннер «С возвращением» («АВТО»).

Чтобы ваш код обратного вызова не обрабатывал каждое событие триггера, вы можете изменить свой код следующим образом:

function signinCallback(authResult) {
    if (authResult['status']['signed_in']) {
        // Update the app to reflect a signed in user
        // Hide the sign-in button now that the user is authorized, for example:
        // document.getElementById('signinButton').setAttribute('style', 'display: none');

        if (authResult['status']['method'] == 'PROMPT') {
            console.log(authResult['status']['method']);

            gapi.client.load('oauth2', 'v2', function () {
                gapi.client.oauth2.userinfo.get().execute(function (resp) {
                    console.log(resp);
                })
            });
        }
    } else {
        // Update the app to reflect a signed out user
        // Possible error values:
        //   "user_signed_out" - User is signed-out
        //   "access_denied" - User denied access to your app
        //   "immediate_failed" - Could not automatically log-in the user
        console.log('Sign-in state: ' + authResult['error']);
    }
}

Этот код вызовет функцию «gapi.client.oauth2.userinfo.get ()» только в том случае, если пользователь вошел в систему и событие, вызвавшее обратный вызов, имеет тип «PROMPT».

person Ben Smith    schedule 15.04.2014
comment
И вы видите «1» только один раз в консоли? Мой по-прежнему отображает его дважды. - person Mike; 16.04.2014
comment
Ты обалденный. Очень признателен! - person Mike; 16.04.2014
comment
Будет ли это работать, если у меня только 1 аккаунт? Будет ли в этом случае срабатывать событие типа ПРОМТ? - person Kicsi; 04.06.2014
comment
@Kicsi Я почти уверен, что так и будет - person Ben Smith; 04.06.2014
comment
Большое спасибо. Это сделало это для меня. - person lpdahito; 12.06.2014
comment
Отличный ответ. Сэкономил кучу времени! - person Evan Hobbs; 16.02.2015

Google всегда проходит через статус «PROMPT», но через статус «AUTO» только тогда, когда у пользователя есть предыдущий успешный вход в систему, и он может автоматически войти в систему.

person nnnn    schedule 16.12.2014