Как определить, было ли окно google auth2.signIn () закрыто пользователем?

Я реализую auth, используя это, и в настоящее время я показываю значок загрузки в React, когда пользователь нажимает кнопку для входа в систему и отображается окно выбора учетной записи / входа в auth2.

Однако, если пользователь закрывает окно, похоже, не было никакого события, то есть функция signIn (), которая возвращает обещание, никогда не разрешается, я бы подумал, что Google вернет ошибку для этого обещания, если окно закрыто. В результате у меня нет возможности перестать показывать значок загрузчика и повторно отображать меню входа в систему.

Мне было интересно, есть ли у кого-нибудь решение для этого?


comment
Привет, Deep .. Ты получил за это какое-то наказание?   -  person Warrior    schedule 18.10.2016
comment
Эй, как тебе это удалось?   -  person Pragati Dugar    schedule 30.06.2020


Ответы (2)


Я пытаюсь изменить свой код, который вызывает окно Google OAuth 2.0.
Вам нужно только добавить дополнительный метод AJAX, который покрывает результат ошибки Google OAuth.

gapi.auth2.getAuthInstance().signIn()

Измените его на этот,

gapi.auth2.getAuthInstance().signIn().then(function(response){
    //If Google OAuth 2 works fine
    console.log(response);
}, function(error){
    //If Google OAuth 2 occured error
    console.log(error);
    if(error.error === 'popup_closed_by_user'){
        alert('Oh Dude, Why you close authentication user window...!');
    }
});

Вот и все ...

Чтобы получить более подробную информацию о Google OAuth 2.0, перейдите по этой ссылке.
https://developers.google.com/api-client-library/javascript/samples/samples#authorizing-and-Making-authorized-requests
Пример кода на JavaScript:
https://github.com/google/google-api-javascript-client/blob/master/samples/authSample.html

person ibnǝꟻ    schedule 08.07.2017

Хотя API предоставляет механизм для определения, когда пользователь нажимает кнопку «Запретить», нет встроенного способа для определения того, что пользователь внезапно закрыл всплывающее окно (или закрыл свой веб-браузер, выключил свой компьютер и т. Д.) . Условие Запретить предоставляется на тот случай, если вы хотите повторно запросить пользователя с ограниченными возможностями (например, вы запросили «электронную почту», но вам нужен только профиль, и вы позволите пользователю продолжить, не сообщая вам свой адрес электронной почты).

Если ответ обратного вызова для входа содержит ошибку access_denied, это означает, что пользователь нажал кнопку «Запретить»:

function onSignInCallback(authResult) {
  if (authResult['error'] && authResult['error'] == 'access_denied') {
    // User explicitly denied this application's requested scopes
  }
}

Вы должны иметь возможность реализовать вход, не определяя, было ли закрыто окно; это демонстрируется практически во всех примерах приложений Google+. Короче говоря, вам следует избегать использования счетчика, как вы это делаете, и вместо этого следует скрывать аутентифицированный пользовательский интерфейс до тех пор, пока пользователь не войдет в систему.

Не рекомендуется делать это, но чтобы реализовать обнаружение закрытия всплывающего окна, вы можете сделать что-то вроде переопределения глобального вызова window.open, а затем определить в window.unload или опросить, было ли закрыто окно без аутентификации пользователя :

var lastOpenedWindow = undefined;
window.open = function (open) {
    return function (url, name, features) {
        // set name if missing here
        name = name || "default_window_name";
        lastOpenedWindow = open.call(window, url, name, features);
        return lastOpenedWindow;
    };
}(window.open);

var intervalHandle = undefined;
function detectClose() {
  intervalHandle = setInterval(function(){
    if (lastOpenedWindow && lastOpenedWindow.closed) {
      // TODO: check user was !authenticated
      console.log("Why did the window close without auth?");
      window.clearInterval(intervalHandle);
    }
  }, 500);
}

Обратите внимание, что, поскольку я реализовал его, этот механизм ненадежен и зависит от условий гонки.

person class    schedule 16.02.2016
comment
Привет, спасибо за ответ, но почему Facebook это предоставляет? У меня есть как facebook, так и google auth в качестве параметров на моей странице, и метод facebook signIn разрешает ошибку, если пользователь закрывает всплывающее окно. Мне это кажется некоторой оплошностью со стороны Google. Счетчик - это просто ux-вещь, чтобы указать пользователю, что процесс входа в систему начался (в случае, если они действительно щелкают в другом окне и теряют отслеживание окна входа в систему). - person Deep; 17.02.2016