Как выйти из приложения, в котором я использовал OAuth2 для входа в Google?


85

В своем приложении я реализовал выход из Google с помощью jsapi.

Я использовал URL-адрес https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=xxxxxx для подключения к Google, а затем https://www.googleapis.com/plus/v1/people/xxxxxx для получения пользовательских данных из профиля Google.

Теперь мне нужно выйти из аккаунта Google, нажав кнопку в моем приложении. Как я могу реализовать это в JavaScript, или, по крайней мере, он должен запрашивать страницу входа в Google каждый раз, когда пользователь входит в систему.

Я пробовал approval_prompt=force, но, похоже, не работает.

Ответы:


246

Обзор OAuth: является ли пользователь тем, кем он / она считает себя ?:

Я не уверен, использовали ли вы OAuth для входа в Stack Overflow, например, вариант «Войти через Google», но когда вы используете эту функцию, Stack Overflow просто спрашивает Google, знает ли он, кто вы:

«Эй, Google, этот парень из Винеша утверждает, что vinesh.e@gmail.com - это он, это правда?»

Если вы уже вошли в систему, Google скажет ДА. Если нет, Google скажет:

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

Когда вы вводите свой пароль Google, Google сообщает Stack Overflow, что вы тот, кем вы себя называете, и Stack Overflow регистрирует вас.

Когда вы выйдите из вашего приложения, вы входите из вашего приложения:

Здесь разработчики, не знакомые с OAuth, иногда могут немного запутаться ... Google и Stack Overflow, Assembla, Vinesh's-very-cool-slick-webapp - это разные сущности, и Google ничего не знает о вашей учетной записи в крутом веб-приложении Vinesh, и наоборот. наоборот, помимо того, что предоставляется через API, который вы используете для доступа к информации профиля.

Когда ваш пользователь выходит из системы, он или она не выходит из Google, он выходит из вашего приложения, или Stack Overflow, или Assembla, или любого другого веб-приложения, использующего Google OAuth для аутентификации пользователя.

Фактически, я могу выйти из всех своих учетных записей Google и по-прежнему находиться в Stack Overflow. Как только ваше приложение узнает, кто является пользователем, этот человек может выйти из Google. Гугл больше не нужен.

С учетом сказанного, вы просите вывести пользователя из службы, которая вам не принадлежит. Подумайте об этом так: как пользователь, как вы думаете, насколько я был бы раздражен, если бы я вошел в 5 разных сервисов с моей учетной записью Google, то при первом выходе из одной из них мне нужно войти в свою учетную запись Gmail опять же, потому что этот разработчик приложения решил, что, когда я выхожу из его приложения, я также должен выйти из Google? Это очень быстро устареет. Короче, вы действительно не хотите этого делать ...

Да, да ладно, я все еще хочу вывести пользователя из Google, просто скажите мне, как мне это сделать?

С учетом сказанного, если вы все еще хотите выйти из системы Google и понимаете, что вполне можете нарушить его рабочий процесс, вы можете динамически создать URL-адрес выхода из одной из их кнопок выхода из службы Google, а затем вызвать его, используя элемент img или тег скрипта:

<script type="text/javascript" 
    src="https://mail.google.com/mail/u/0/?logout&hl=en" />

ИЛИ ЖЕ

<img src="https://mail.google.com/mail/u/0/?logout&hl=en" />

ИЛИ ЖЕ

window.location = "https://mail.google.com/mail/u/0/?logout&hl=en";

Если вы перенаправляете своего пользователя на страницу выхода или вызываете его из элемента, не имеющего междоменного ограничения, пользователь выйдет из системы Google.

Обратите внимание, что это не обязательно означает, что пользователь выйдет из вашего приложения, только Google. :)

Резюме:

Вам важно помнить, что при выходе из приложения вам не нужно заставлять пользователя повторно вводить пароль. В этом весь смысл! Он выполняет аутентификацию в Google, поэтому пользователю не нужно снова и снова вводить свой пароль в каждом веб-приложении, которое он использует. К этому нужно привыкнуть, но знайте, что, пока пользователь вошел в систему Google, вашему приложению не нужно беспокоиться о том, является ли пользователь тем, кем он / она себя называет.

У меня такая же реализация в проекте, как и у вас, с использованием информации профиля Google с OAuth. Я попробовал то же самое, что и вы, и это действительно начало рассердить людей, когда им приходилось заходить в Google снова и снова, поэтому мы перестали выводить их из Google. :)


8
Спасибо за ваше драгоценное время и такое большое описание. Но у моего клиента другое мнение. Предположим, что пользователь вошел в приложение, используя свой логин Google из общедоступной системы, и вышел из приложения. Он может подумать, что он тоже вышел из Google, но на самом деле это не так! Любой другой пользователь, использующий систему позже, получит доступ к учетной записи Google.
Vinesh EG

13
Тогда вашим пользователям также необходимо выйти из Google. Дело в том, что они входят в 2 сервиса. Ваши пользователи должны научиться использовать OAuth. :) Я предлагаю обучить вашего клиента и пользователей. Если нужно, покажите им. Это не займет много времени, чтобы внедрить и отменить позже, когда вы поймете, насколько это отстой. :) Я не верил в это для себя, пока я не сделал это и не увидел, сколько PITA нужно было снова входить в Google каждый раз, когда я выходил из LoopToDo. Рассмотрим, может быть, сообщение «Вы вышли из классного приложения Винеша, не забудьте> выйти и из Google <!»
jmort253

1
@ jmort253 Да, я понимаю, что им больше не нужно предоставлять разрешения, но как мне снова их аутентифицировать? См. Этот вопрос, который я задал (я все еще новичок в OAuth): stackoverflow.com/questions/37515836/…
Апурв Кансал,

2
@ jmort253 Однако что, если для пользователя слово «отключить» означает полный выход из приложения. Поскольку он автоматически входит в систему без повторного ввода учетных данных, возникает 2 проблемы; Пользователь задается вопросом, что случилось. Я только что отключился, и у него не должно быть моей информации, а второй пользователь не сможет войти в другую учетную запись, потому что он всегда будет автоматически входить в систему, если провайдер аутентификации не предоставляет метод принудительного входа. Таким образом, в этом случае желателен выход из системы, чтобы он мог сделать файлы cookie недействительными, и вам больше не нужно было беспокоиться о том, как им управлять на стороне клиента.
darewreck

1
Это полезно для приложений Electron, в которых пользователь вошел в систему с помощью Google! В этом случае при выходе их из Google они выходят только из одного приложения (приложения Electron).
trusktr

21

Вы можете выйти из системы и перейти на свой сайт:

var logout = function() {
    document.location.href = "https://www.google.com/accounts/Logout?continue=https://appengine.google.com/_ah/logout?continue=http://www.example.com";
}

1
В заключение! Спасибо! Я целый день пытался найти, как выйти из системы, чтобы следующий пользователь не мог войти в систему как предыдущий пользователь одним щелчком мыши, не зная
некоторые

1
Это не работает, потому что достаточно открыть ту же страницу в другой вкладке, и вы снова вошли в систему ...
Бартломей Семанчик

1
Благодарю. Я искал это уже много лет.
sakib11 02

6

У меня работает (java - android)

void RevokeAcess()
{
    try{
    HttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost("https://accounts.google.com/o/oauth2/revoke?token="+ACCESS_TOKEN);
    org.apache.http.HttpResponse response = client.execute(post);
    }
    catch(IOException e)
    {
    }
    CookieManager.getInstance().removeAllCookie(); // this is clear the cookies which tends to same user in android web view
}

Вы должны вызвать эту функцию в AsyncTask в android


2
Хотя это правда, что это сработает, на самом деле вопрос касается JavaScript, а не Java.
jmort253

2
Звучит странно, что все, что вам нужно, это токен, вы можете грубо заставить Google принудительно выйти из системы.
Archimedes Trajano

Он не выйдет из системы, он выйдет только из приложения (в Android).
Vinoj John Hosan

2
Глядя на некоторые из google oauth2, типичный токен доступа выглядит так. «1 / fFAGRNJru1FTz70BzhT3Zg» Предполагая, что часть «1 /» предназначена только для того, чтобы людям было легче определить число. У вас по-прежнему есть два алфавита (верхний и нижний регистр) плюс десять числовых цифр длиной 22 символа. Это 22 ^ (26 * 2 + 10), что равно 1,6990502e + 83. Или о количестве атомов в известной Вселенной . Удачи, грубо форсировали это через HTTP. ;)
Крис Балог

Похоже, это не отменяет токен обновления, который может быть украден до удаления файлов cookie (если он там хранится).
Ондрей Галбавы


1

Это работает для выхода пользователя из приложения, но не для Google.

var auth2 = gapi.auth2.getAuthInstance();
auth2.signOut().then(function () {
  console.log('User signed out.');
});

Источник: https://developers.google.com/identity/sign-in/web/sign-in


1
это не приведет к полному выходу пользователя из его / ее учетной записи Google. Он уничтожает только то, AuthInstanceчто вы использовали. Сам ваш источник говорит ... « Вы можете разрешить пользователям выходить из вашего приложения, не выходя из Google ... »
Рошана Питигала

@RoshanaPitigala обновил ответ, чтобы указать. Этот ответ является ответом на заголовок вопроса, но как только вы прочитаете вопрос более подробно, вы поймете, что заголовок был написан неправильно. Этот ответ работает для всех, кто сделал это здесь, в соответствии с названием вопроса.
CamHart

1

Ouath просто обнуляет экземпляр Google, следовательно, он не работает в Google. Вот как устроена архитектура. Выход из Google, если вы выходите из своего приложения, - грязная работа, но не может помочь, если требование предусматривает то же самое. Следовательно, добавьте в свою функцию signOut () следующее. Моим проектом было приложение Angular 6:

document.location.href = " https://www.google.com/accounts/Logout?continue=https://appengine.google.com/_ah/logout?continue=http://localhost:4200 ";

Здесь localhost: 4200 - это URL-адрес моего приложения. Если ваша страница входа - xyz.com, введите это.


1

этот код будет работать для выхода

    <script>
      function signOut() 
      {
        var auth2 = gapi.auth2.getAuthInstance();
        auth2.signOut().then(function () {   
        console.log('User signed out.');   
        auth2.disconnect();   
      }); 
        auth2.disconnect();
      } 
    </script>

1

Чтобы выйти только из приложения, но не из Gmail:

window.gapi.load('auth2', () => {
      window.gapi.auth2
        .init({
          client_id:
            '<Your client id configired on google console>'
        })
        .then(() => {
          window.gapi.auth2
            .getAuthInstance()
            .signOut()
            .then(function() {
              console.log('User signed out.');
            });
        });
    });

Я использую выше в своем коде ReactJs.


0

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

    String _accessToken=(String)session.getAttribute("ACCESS_TOKEN");
    if(_accessToken!=null)
    {
        StringBuffer path=httpRequest.getRequestURL();
        reDirectPage="https://www.google.com/accounts/Logout?
        continue=https://appengine.google.com/_ah/logout?
        continue="+path;
    }
    response.sendRedirect(reDirectPage);

0

Похоже, Google недавно что-то сломал со своими отзывами (он начал возвращать нам 400 ошибок). Теперь тебе нужно позвонить

auth2.disconnect ();

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.