Вопрос

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

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

Почему это происходит? Это проблема, потому что там, где я выплюнул данные, я хотел бы сделать Ajax Call для проверки пользователя, а затем перенаправить их. Поэтому, по сути, он пытается сделать это дважды - что не круто, что, если я не хочу войти в систему, используя учетные данные, которые 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: COUNCOLE.LOG (соответственно) выводит дважды

<Сильное> Обновление 3: Просто больше разъяснений:

Firebug

Это было полезно?

Решение

Вы столкнулись с двумя вызовами на «Console.log (соответственно);» Внутри вашей функции «GoogleCallback», потому что:

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

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

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

Итак, ваш код обратного вызова срабатывается при появлении подсказки для входа («Подсказка») и когда появится баннер «ReCome Back» («AUTO»).

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

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.gient.oauth2.userinfo.get (), если пользователь включен и событие, которое вызвало обратный вызов, имеет тип« Подсказка ».

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top