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 ответа:
Вы столкнулись с двумя вызовами " консоль.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 ()" функция, если пользователь вошел в систему и событие, которое вызвало обратный вызов, имеет введите "подсказка".