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

Вход в Google дважды?

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

Когда я нажимаю кнопку "Вход в систему с Google", она выплевывает (данные console.log(result)) для пользователя. THEN появляется запрос с просьбой выбрать мою учетную запись (я зарегистрирован в нескольких учетных записях 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(resp) выводит дважды

Обновление 3: Просто уточнение:

firebug

4b9b3361

Ответ 1

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

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

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

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

  • NULL
  • ПОДСКАЖИТЕ
  • AUTO

Таким образом, ваш код обратного вызова запускается при появлении приглашения для входа ( "PROMPT" ) и при появлении баннера "Добро пожаловать назад" ( "АВТО" ).

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

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".

Ответ 2

Google всегда просматривает статус "PROMPT", но через статус "АВТО", когда пользователь имеет предыдущий вход в систему и он может автоматически войти в систему.