Come disconnettersi da un'applicazione in cui ho utilizzato OAuth2 per accedere con Google?


85

Nella mia applicazione, ho implementato Google signout utilizzando jsapi.

Ho usato l'url https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=xxxxxx per connettermi a Google e poi https://www.googleapis.com/plus/v1/people/xxxxxx per ottenere i dati dell'utente dal profilo google.

Ora devo escludere l'utente da Google mentre faccio clic su un pulsante dalla mia applicazione. Come posso implementarlo in JavaScript, o almeno deve chiedere alla pagina di accesso di Google ogni volta che l'utente accede.

Ho provato approval_prompt=force, ma sembra non funzionare.

Risposte:


246

Panoramica di OAuth: l'utente è chi dice di essere ?:

Non sono sicuro che tu abbia utilizzato OAuth per accedere a Stack Overflow, come l'opzione "Accedi con Google", ma quando utilizzi questa funzione, Stack Overflow chiede semplicemente a Google se sa chi sei:

"Yo Google, questo tizio di Vinesh afferma che vinesh.e@gmail.com è lui, è vero?"

Se hai già effettuato l'accesso, Google dirà SÌ. In caso contrario, Google dirà:

"Aspetta un secondo Stack Overflow, autenticherò questo tizio e se può inserire la password giusta per il suo account Google, allora è lui".

Quando inserisci la tua password Google, Google dice a Stack Overflow che sei chi dici di essere e Stack Overflow ti accede.

Quando esci dalla tua app, esci dalla tua app:

È qui che gli sviluppatori nuovi di OAuth a volte si confondono un po '... Google e Stack Overflow, Assembla, Vinesh's-very-cool-slick-webapp, sono tutte entità diverse e Google non sa nulla del tuo account sulla fantastica webapp di Vinesh e vice viceversa, a parte ciò che viene esposto tramite l'API che stai utilizzando per accedere alle informazioni del profilo.

Quando il tuo utente si disconnette, non si disconnette da Google, si disconnette dalla tua app, da Stack Overflow o da Assembla o da qualsiasi applicazione web che abbia utilizzato Google OAuth per autenticare l'utente.

In effetti, posso disconnettermi da tutti i miei account Google ed essere ancora connesso a Stack Overflow. Una volta che la tua app sa chi è l'utente, quella persona può disconnettersi da Google. Google non è più necessario.

Detto questo, quello che stai chiedendo di fare è disconnettere l'utente da un servizio che in realtà non ti appartiene. Pensaci in questo modo: come utente, quanto pensi che sarei infastidito se avessi effettuato l'accesso a 5 diversi servizi con il mio account Google, quindi la prima volta che mi sono disconnesso da uno di essi, devo accedere al mio account Gmail ancora perché quello sviluppatore di app ha deciso che, quando esco dalla sua applicazione, dovrei essere disconnesso anche da Google? Diventerà vecchio molto velocemente. In breve, davvero non vuoi farlo ...

Sì, sì, qualunque cosa, voglio ancora disconnettere l'utente da Google, dimmi solo come faccio?

Detto questo, se desideri ancora disconnettere un utente da Google e ti rendi conto che potresti benissimo interrompere il suo flusso di lavoro, potresti creare dinamicamente l'URL di logout da uno dei loro pulsanti di logout dei servizi Google e quindi richiamarlo utilizzando un elemento img o un tag script:

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

O

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

O

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

Se reindirizzi il tuo utente alla pagina di disconnessione o lo richiami da un elemento che non è limitato a più domini, l'utente verrà disconnesso da Google.

Tieni presente che questo non significa necessariamente che l'utente verrà disconnesso dalla tua applicazione, ma solo da Google. :)

Sommario:

Ciò che è importante tenere a mente è che, quando esci dalla tua app, non è necessario che l'utente reinserisca una password. Questo è il punto! Si autentica su Google in modo che l'utente non debba inserire la propria password più e più volte in ogni applicazione web che utilizza. Ci vuole un po 'per abituarsi, ma sappi che, finché l'utente è connesso a Google, la tua app non deve preoccuparsi se l'utente è o meno chi dice di essere.

Ho la stessa implementazione in un progetto che hai tu, utilizzando le informazioni del profilo Google con OAuth. Ho provato la stessa cosa che stai cercando di provare, e ha davvero iniziato a far arrabbiare le persone quando hanno dovuto accedere a Google più e più volte, quindi abbiamo smesso di disconnetterle da Google. :)


8
Grazie per il tuo tempo prezioso e per una descrizione così ampia. Ma il mio cliente ha un'opinione diversa. Supponiamo che l'utente acceda all'applicazione utilizzando il suo login google da un sistema pubblico e si disconnetta dall'applicazione. Potrebbe anche pensare di essersi disconnesso da Google, ma in realtà no! Qualsiasi altro utente che utilizza il sistema in seguito avrà accesso all'account Google.
Vinesh EG

13
Quindi anche i tuoi utenti devono disconnettersi da Google. Il punto è che stanno accedendo a 2 servizi. I tuoi utenti devono imparare a utilizzare OAuth. :) Suggerirei di istruire il tuo cliente e gli utenti. Se devi, vai avanti e mostraglielo. Non dovrebbe volerci molto per implementarlo e poi annullarlo in seguito quando ti rendi conto di quanto fa schifo. :) Non ci credevo fino a quando non l'ho fatto effettivamente e ho visto quanto fosse PITA dover accedere di nuovo a Google ogni volta che mi sono disconnesso da LoopToDo. Considera forse un messaggio "Sei disconnesso dalla fantastica app di Vinesh, non dimenticare di> disconnetterti anche da Google <!"
jmort253

1
@ jmort253 Sì, capisco che non è più necessario fornire le autorizzazioni, ma come dovrei autenticarli di nuovo? Si prega di consultare questa domanda che ho fatto (io sono ancora nuovo a OAuth): stackoverflow.com/questions/37515836/...
Apoorv Kansal

2
@ jmort253 Tuttavia, cosa succede se per l'utente la parola "disconnessione" implica la disconnessione totale dall'applicazione .. Poiché si riconnette automaticamente senza digitare nuovamente le credenziali, ci sono 2 problemi; l'utente si chiede cosa sia successo. Mi sono appena disconnesso e non dovrebbe avere le mie informazioni e il secondo utente non sarà in grado di accedere a un account diverso perché accederà sempre automaticamente a meno che il provider di autenticazione non fornisca un metodo di accesso forzato. Quindi in questo caso è auspicabile il logout in modo che possa invalidare i cookie e non devi più preoccuparti di come viene gestito lato client.
Darewreck

1
Questo è utile per le applicazioni Electron, dove l'utente ha effettuato l'accesso con Google! In questo caso, disconnettendoli da Google li disconnetti da una sola app (l'app Electron).
trusktr

21

Puoi disconnetterti e reindirizzare al tuo sito:

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
Finalmente! Grazie! Ho provato per un giorno intero a scoprire come disconnettermi, per impedire all'utente successivo di accedere come utente precedente con un semplice clic, senza conoscere l'e-mail o la password ...
alcuni

1
Non funziona, perché è sufficiente aprire la stessa pagina in un'altra scheda e accedere di nuovo ...
Bartłomiej Semańczyk

1
Grazie. Lo cerco da anni ormai.
sakib11

6

Per me funziona (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
}

Devi chiamare questa funzione in AsyncTask in Android


2
Sebbene sia vero che questo funzionerebbe, la domanda è in realtà chiedersi su JavaScript, non su Java.
jmort253

2
Sembra strano che tutto ciò di cui hai bisogno è un token, puoi forzare Google a disconnettere forzatamente tutti.
Archimedes Trajano

Non ti disconnetterà dal dispositivo, disconnetterà solo l'applicazione (in Android).
Vinoj John Hosan

2
Guardando alcuni dei documenti di Google oauth2, un tipico token di accesso appare come questo. "1 / fFAGRNJru1FTz70BzhT3Zg" Supponendo che la parte "1 /" sia solo per gli umani per identificare il numero più facilmente. Hai ancora due alfabeti (maiuscolo e minuscolo) più dieci cifre numeriche con una lunghezza di 22 caratteri. È 22 ^ (26 * 2 + 10) che è uguale a 1.6990502e + 83. O sul numero di atomi nell'universo conosciuto . Buona fortuna bruta forzandola su HTTP. ;)
Chris Balogh

Questo non sembra revocare il token di aggiornamento, che potrebbe essere rubato prima di rimuovere i cookie (se è memorizzato lì).
Ondrej Galbavý


1

Funziona per disconnettere l'utente dall'applicazione, ma non da Google.

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

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


1
questo non disconnetterà completamente l'utente dal suo account Google. Distrugge solo quello AuthInstanceche hai usato. La tua fonte stessa dice ... " Puoi consentire agli utenti di uscire dalla tua app senza uscire da Google ... "
Roshana Pitigala

@RoshanaPitigala ha aggiornato la risposta per specificare. Questa risposta è la risposta al titolo della domanda, ma una volta letta la domanda in modo più dettagliato capisci che il titolo è stato scritto in modo errato. Questa risposta funziona per chiunque sia arrivato qui in base al titolo della domanda.
CamHart

1

Ouath rende semplicemente nulla l'istanza di Google, quindi sei fuori da Google. Ecco come è fatta l'architettura. Disconnettersi da Google, se esci dalla tua app è un lavoro sporco, ma non può essere d'aiuto se il requisito lo prevede. Quindi aggiungi quanto segue alla tua funzione signOut (). Il mio progetto era un'app Angular 6:

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

Qui localhost: 4200 è l'URL della mia app. Se la tua pagina di accesso è xyz.com, inseriscila.


1

questo codice funzionerà per disconnettersi

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

1

Per disconnettersi solo dall'app ma non da 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.');
            });
        });
    });

Sto usando sopra nel mio codice ReactJs.


0

Spero che possiamo ottenere questo risultato archiviando il token in sessione durante l'accesso e accedendo al token quando ha fatto clic su logout.

    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

Sembra che Google abbia recentemente rotto qualcosa con la loro roba di revoca (ha iniziato a restituirci 400 errori). Ora devi chiamare

auth2.disconnect ();

Nel nostro caso dobbiamo quindi attendere un paio di secondi per il completamento della chiamata di disconnessione altrimenti il ​​codice di accesso verrà nuovamente autorizzato prima che sia fatto. Sarebbe bello se Google restituisse una promessa dal metodo di disconnessione.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.