Google Login Ударил Дважды?


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

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

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

Обновление 3: просто еще одно уточнение:

поджигатель

2 16

2 ответа:

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

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

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

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

  • null
  • подсказка
  • авто

Таким образом, ваш код обратного вызова срабатывает при появлении запроса на вход ("PROMPT") и при появлении баннера "Welcome 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.клиент.что OAuth2.сведений о пользователях.get ()" функция, если пользователь вошел в систему и событие, которое вызвало обратный вызов, имеет введите "подсказка".

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