Wie melde ich mich von einer Anwendung ab, bei der ich mich mit OAuth2 bei Google angemeldet habe?

84

In meiner Anwendung habe ich Google Signout mit jsapi implementiert.

Ich habe die URL https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=xxxxxx verwendet , um eine Verbindung zu Google herzustellen , und dann https://www.googleapis.com/plus/v1/people/xxxxxx , um Benutzerdaten abzurufen vom Google-Profil.

Jetzt muss ich den Nutzer von Google abmelden, während ich auf eine Schaltfläche in meiner Anwendung klicke. Wie kann ich dies in JavaScript implementieren, oder zumindest muss es die Google-Anmeldeseite jedes Mal fragen, wenn sich der Benutzer anmeldet.

Ich habe es versucht approval_prompt=force, scheint aber nicht zu funktionieren.

Vinesh EG
quelle

Antworten:

239

Überblick über OAuth: Ist der Benutzer, der er / sie sagt, dass er / sie ist?:

Ich bin nicht sicher, ob Sie OAuth verwendet haben, um sich bei Stack Overflow anzumelden, wie bei der Option "Mit Google anmelden". Wenn Sie diese Funktion verwenden, fragt Stack Overflow Google einfach, ob es weiß, wer Sie sind:

"Yo Google, dieser Vinesh-Typ behauptet, dass [email protected] er ist, stimmt das?"

Wenn Sie bereits angemeldet sind, sagt Google JA. Wenn nicht, sagt Google:

"Warte einen Sekunden-Stapelüberlauf, ich werde diesen Kerl authentifizieren und wenn er das richtige Passwort für sein Google-Konto eingeben kann, dann ist er es."

Wenn Sie Ihr Google-Passwort eingeben, teilt Google Stack Overflow mit, dass Sie der sind, für den Sie sich ausgeben, und Stack Overflow meldet Sie an.

Wenn Sie sich von Ihrer App abmelden, melden Sie sich von Ihrer App ab:

Hier sind Entwickler, die neu bei OAuth sind, manchmal etwas verwirrt ... Google und Stack Overflow, Assembla, Vineshs sehr coole Slick-Webapp, sind verschiedene Einheiten, und Google weiß nichts über Ihr Konto in Vineshs cooler Webapp und umgekehrt Umgekehrt, abgesehen davon, was über die API verfügbar gemacht wird, mit der Sie auf Profilinformationen zugreifen.

Wenn sich Ihr Nutzer abmeldet, meldet er sich nicht bei Google ab, sondern bei Ihrer App, Stack Overflow oder Assembla oder einer anderen Webanwendung, die Google OAuth zur Authentifizierung des Nutzers verwendet hat.

Tatsächlich kann ich mich von allen meinen Google-Konten abmelden und trotzdem bei Stack Overflow angemeldet sein. Sobald Ihre App weiß, wer der Nutzer ist, kann sich diese Person bei Google abmelden. Google wird nicht mehr benötigt.

Wenn dies gesagt ist, möchten Sie den Benutzer von einem Dienst abmelden, der Ihnen wirklich nicht gehört. Stellen Sie sich das so vor: Wie genervt wäre ich als Nutzer, wenn ich mich mit meinem Google-Konto bei 5 verschiedenen Diensten anmelden würde. Wenn ich mich zum ersten Mal von einem dieser Dienste abmelden würde, muss ich mich bei meinem Google Mail-Konto anmelden wieder, weil dieser App-Entwickler entschieden hat, dass ich beim Abmelden von seiner Anwendung auch von Google abgemeldet werden soll? Das wird sehr schnell alt. Kurz gesagt, Sie wollen das wirklich nicht tun ...

Yeh yeh, was auch immer, ich möchte den Nutzer immer noch von Google abmelden. Sagen Sie mir einfach, wie ich das mache.

Wenn Sie dennoch einen Nutzer von Google abmelden möchten und feststellen, dass Sie möglicherweise dessen Workflow stören, können Sie die Abmelde-URL dynamisch über eine der Abmeldeschaltflächen für Google-Dienste erstellen und diese dann mit aufrufen ein img-Element oder ein Skript-Tag:

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

ODER

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

ODER

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

Wenn Sie Ihren Nutzer auf die Abmeldeseite umleiten oder von einem Element aus aufrufen, das nicht domänenübergreifend beschränkt ist, wird der Nutzer von Google abgemeldet.

Beachten Sie, dass dies nicht unbedingt bedeutet, dass der Nutzer von Ihrer Anwendung abgemeldet wird, sondern nur von Google. :) :)

Zusammenfassung:

Beachten Sie, dass Sie den Benutzer beim Abmelden von Ihrer App nicht dazu zwingen müssen, ein Kennwort erneut einzugeben. Das ist der springende Punkt! Es authentifiziert sich gegenüber Google, sodass der Nutzer sein Passwort nicht in jeder von ihm verwendeten Webanwendung immer und immer wieder eingeben muss. Es ist gewöhnungsbedürftig, aber Sie müssen wissen, dass sich Ihre App, solange der Nutzer bei Google angemeldet ist, keine Gedanken darüber machen muss, ob der Nutzer der ist, von dem er sagt, dass er er ist.

Ich habe dieselbe Implementierung in einem Projekt wie Sie, indem ich die Google-Profilinformationen mit OAuth verwende. Ich habe genau das versucht, was Sie versuchen möchten, und es hat die Leute wirklich wütend gemacht, als sie sich immer wieder bei Google anmelden mussten. Deshalb haben wir aufgehört, sie von Google abzumelden. :) :)

jmort253
quelle
8
Vielen Dank für Ihre wertvolle Zeit und eine so große Beschreibung. Aber mein Kunde hat eine andere Meinung. Angenommen, der Benutzer meldet sich mit seinem Google-Login von einem öffentlichen System aus bei der Anwendung an und meldet sich von der Anwendung ab. Er könnte denken, dass er sich auch von Google abgemeldet hatte, aber eigentlich nicht! Jeder andere Benutzer, der das System später verwendet, erhält Zugriff auf das Google-Konto.
Vinesh EG
12
Dann müssen sich auch Ihre Nutzer bei Google abmelden. Der Punkt ist, dass sie sich bei 2 Diensten anmelden. Ihre Benutzer müssen lernen, wie man OAuth verwendet. :) Ich würde vorschlagen, Ihren Kunden und die Benutzer zu informieren. Wenn Sie müssen, zeigen Sie es ihnen. Die Implementierung sollte nicht lange dauern und später rückgängig gemacht werden, wenn Sie feststellen, wie viel es saugt. :) Ich habe es mir selbst nicht geglaubt, bis ich dies tatsächlich getan habe und gesehen habe, wie viel PITA es war, mich jedes Mal wieder bei Google anmelden zu müssen, wenn ich mich von LoopToDo abgemeldet habe. Betrachten Sie möglicherweise die Meldung "Sie sind von Vineshs cooler App abgemeldet. Vergessen Sie nicht, sich> auch von Google abzumelden <!"
jmort253
1
@ jmort253 Ja, ich verstehe, dass sie keine Berechtigungen mehr bereitstellen müssen, aber wie soll ich sie erneut authentifizieren? Bitte sehen Sie diese Frage, die ich gestellt habe (ich bin noch neu in OAuth): stackoverflow.com/questions/37515836/…
Apoorv Kansal
1
@ jmort253 Was ist jedoch, wenn für den Benutzer das Wort "Trennen" die vollständige Abmeldung von der Anwendung impliziert? Da die automatische Anmeldung ohne erneute Eingabe der Anmeldeinformationen erfolgt, gibt es zwei Probleme. Der Benutzer fragt sich, was passiert ist. Ich habe gerade die Verbindung getrennt und meine Informationen sollten nicht vorhanden sein. Der zweite Benutzer kann sich nicht bei einem anderen Konto anmelden, da er sich immer automatisch anmeldet, es sei denn, der Authentifizierungsanbieter bietet eine Force-Login-Methode an. In diesem Fall ist eine Abmeldung wünschenswert, damit die Cookies ungültig werden und Sie sich keine Gedanken mehr darüber machen müssen, wie sie auf der Clientseite verwaltet werden.
Darewreck
1
Dies ist nützlich für Electron-Anwendungen, bei denen sich der Nutzer bei Google angemeldet hat! In diesem Fall werden sie durch Abmelden von Google nur von einer App (der Electron-App) abgemeldet.
Trusktr
21

Sie können sich abmelden und auf Ihre Website umleiten:

var logout = function() {
    document.location.href = "https://www.google.com/accounts/Logout?continue=https://appengine.google.com/_ah/logout?continue=http://www.example.com";
}
lgabster
quelle
1
Schließlich! Danke dir! Ich habe einen ganzen Tag lang versucht, herauszufinden, wie ich mich abmelden kann, um zu verhindern, dass sich der nächste Benutzer mit nur einem Klick als vorheriger Benutzer anmeldet, ohne die E-Mail oder das Passwort zu kennen ...
etwa
1
Es funktioniert nicht, weil es ausreicht, dieselbe Seite in einem anderen Tab zu öffnen, und Sie erneut angemeldet sind ...
Bartłomiej Semańczyk
5

Bei mir funktioniert es (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
}

Sie müssen diese Funktion in AsyncTask in Android aufrufen

Vinoj John Hosan
quelle
2
Es stimmt zwar, dass dies funktionieren würde, aber die Frage bezieht sich tatsächlich auf JavaScript, nicht auf Java.
jmort253
2
Das klingt verrückt, dass alles, was Sie brauchen, ein Token ist. Sie können Google brutal zwingen, um alle zwangsweise abzumelden.
Archimedes Trajano
Sie werden nicht vom Gerät abgemeldet, sondern nur die Anwendung (in Android).
Vinoj John Hosan
2
Wenn Sie sich einige der Google Oauth2-Dokumente ansehen, sieht ein typisches Zugriffstoken so aus. "1 / fFAGRNJru1FTz70BzhT3Zg" Angenommen, der Teil "1 /" ist nur für Menschen, um die Nummer leichter zu identifizieren. Sie haben noch zwei Alphabete (Groß- und Kleinbuchstaben) sowie zehn Ziffern mit einer Länge von 22 Zeichen. Das sind 22 ^ (26 * 2 + 10), was 1,6990502e + 83 entspricht. Oder über die Anzahl der Atome im bekannten Universum . Viel Glück, dass Brute das über HTTP erzwingt. ;)
Chris Balogh
Dies scheint das Aktualisierungstoken nicht zu widerrufen, das vor dem Entfernen von Cookies gestohlen werden könnte (sofern es dort gespeichert ist).
Ondrej Galbavý
1

Dies funktioniert, um den Benutzer von der Anwendung abzumelden, nicht jedoch Google.

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

Quelle: https://developers.google.com/identity/sign-in/web/sign-in

CamHart
quelle
1
Dadurch wird der Nutzer nicht vollständig von seinem Google-Konto abgemeldet. Es zerstört nur das, AuthInstancewas du benutzt hast. Ihre Quelle selbst sagt ... " Sie können Benutzern ermöglichen, sich von Ihrer App
abzumelden,
@RoshanaPitigala hat die Antwort aktualisiert, um sie anzugeben. Diese Antwort ist die Antwort auf den Titel der Frage, aber sobald Sie die Frage genauer gelesen haben, verstehen Sie, dass der Titel falsch geschrieben wurde. Diese Antwort funktioniert für alle, die es hier gemäß dem Titel der Frage geschafft haben.
CamHart
1

Ouath macht die Google-Instanz nur null, daher haben Sie Google verlassen. So entsteht die Architektur. Das Abmelden von Google, wenn Sie sich von Ihrer App abmelden, ist eine schmutzige Arbeit, kann aber nicht helfen, wenn die Anforderung dies vorsieht. Fügen Sie daher Ihrer signOut () - Funktion Folgendes hinzu. Mein Projekt war eine Angular 6 App:

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

Hier localhost: 4200 ist die URL meiner App. Wenn Ihre Anmeldeseite xyz.com ist, geben Sie dies ein.

Rahul Sharma
quelle
1

Dieser Code funktioniert zum Abmelden

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

So melden Sie sich nur von der App ab, nicht jedoch von Google Mail:

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.');
            });
        });
    });

Ich verwende oben in meinem ReactJs-Code.

Sunil Kumar Singh
quelle
0

Ich hoffe, wir können dies erreichen, indem wir das Token während der Anmeldung in einer Sitzung speichern und auf das Token zugreifen, wenn er auf Abmelden geklickt hat.

    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);
Janakiram
quelle
0

Es sieht so aus, als hätte Google kürzlich etwas mit seinem Widerrufsmaterial gebrochen (es hat begonnen, 400 Fehler für uns zurückzugeben). Sie müssen jetzt anrufen

auth2.disconnect ();

In unserem Fall müssen wir dann einige Sekunden warten, bis der Verbindungsabbruch abgeschlossen ist. Andernfalls wird der Anmeldecode erneut autorisiert, bevor er abgeschlossen ist. Es wäre gut, wenn Google ein Versprechen von der Trennungsmethode zurückgeben würde.

Sean
quelle