Як вийти з програми, де я використовував OAuth2 для входу в Google?


84

У моїй програмі я реалізував вихід з 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, але, здається, не працює.

Відповіді:


243

Огляд OAuth: Користувач, ким він / вона каже, що є ?:

Я не впевнений, що ви використовували OAuth для входу в Stack Overflow, як опція "Увійти за допомогою Google", але коли ви використовуєте цю функцію, Stack Overflow просто запитує Google, чи знає він, хто ви:

"Yo 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. 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

12
Тоді вашим користувачам також потрібно вийти з Google. Справа в тому, що вони входять у 2 служби. Ваші користувачі повинні навчитися користуватися OAuth. :) Я пропоную проінформувати свого клієнта та користувачів. Якщо вам доведеться, вперед і покажіть їх. Його впровадження не займе багато часу, а потім скасуйте пізніше, коли зрозумієте, наскільки це відмовно. :) Я не вірив цьому для себе, доки насправді не зробив цього і не побачив, скільки було PITA, коли потрібно було знову входити в Google щоразу, коли я виходив із LoopToDo. Подумайте, можливо, про повідомлення: "Ви вийшли з класної програми Vinesh, не забудьте> також вийти з Google <!"
jmort253

1
@ jmort253 Так, я розумію, що їм більше не потрібно надавати дозволи, але як мені знову їх аутентифікувати? Будь ласка , дивіться на це питання я зробив (я ще новачок в OAuth): stackoverflow.com/questions/37515836 / ...
Apoorv Кансай

1
@ jmort253 Однак, що, якщо для користувача слово "відключити" означає загальний вихід із програми .. Оскільки він автоматично входить назад, не вводячи облікові дані знову, є 2 проблеми; користувач задається питанням, що сталося, що я щойно відключився, і у нього не повинно бути моєї інформації, а другий користувач не зможе ввійти в інший обліковий запис, оскільки він завжди буде автоматично входити, якщо постачальник автентифікацій не надасть метод примусового входу. Отже, у цьому випадку бажаний вихід із системи, щоб він міг визначити недійсні файли cookie, і вам більше не потрібно було турбуватися про те, як це вдається на стороні клієнта.
аварія

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
Це не працює, тому що досить відкрити ту саму сторінку на іншій вкладці, і ви знову ввійшли в систему ...
Bartłomiej Semańczyk

5

Для мене це працює (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 примусово вийти з системи всіх.
Архімед Траяно

Він не вийде з пристрою, він вийде з програми (лише в android).
Vinoj John Hosan

2
З перегляду деяких документів google oauth2 типовий маркер доступу виглядає так. "1 / fFAGRNJru1FTz70BzhT3Zg" Якщо припустити, що частина "1 /" - це просто для людей, щоб легше визначити число. У вас все ще є два алфавіти (великі та малі), а також десять цифрових цифр довжиною 22 символи. Це 22 ^ (26 * 2 + 10), що дорівнює 1,6990502e + 83. Або про кількість атомів у відомому Всесвіті . Удачі, грубий примус цього через HTTP. ;)
Кріс Балог,

Схоже, це не скасовує маркер оновлення, який можна було вкрасти перед видаленням файлів cookie (якщо він там зберігається).
Ondrej Galbavý


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.