¿Cómo cerrar la sesión de una aplicación en la que utilicé OAuth2 para iniciar sesión con Google?

84

En mi aplicación, implementé el cierre de sesión de Google usando jsapi.

Usé la url https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=xxxxxx para conectarme a Google y luego https://www.googleapis.com/plus/v1/people/xxxxxx para obtener datos de usuario del perfil de google.

Ahora necesito cerrar la sesión del usuario de Google mientras hago clic en un botón de mi aplicación. ¿Cómo puedo implementar esto en JavaScript, o al menos debe preguntar a la página de inicio de sesión de Google cada vez que el usuario inicia sesión?

Lo he intentado approval_prompt=force, pero parece que no funciona.

Vinesh EG
fuente

Respuestas:

244

Descripción general de OAuth: ¿Es el usuario quien dice ser ?:

No estoy seguro de si usó OAuth para iniciar sesión en Stack Overflow, como la opción "Iniciar sesión con Google", pero cuando usa esta función, Stack Overflow simplemente le pregunta a Google si sabe quién es usted:

"Yo, Google, este tipo de Vinesh afirma que [email protected] es él, ¿es cierto?"

Si ya inició sesión, Google dirá SÍ. Si no, Google dirá:

"Espere un segundo Stack Overflow, autenticaré a este tipo y si puede ingresar la contraseña correcta para su cuenta de Google, entonces es él".

Cuando ingresa su contraseña de Google, Google le dice a Stack Overflow que es quien dice ser, y Stack Overflow lo conecta.

Cuando cierra la sesión de su aplicación, está cerrando la sesión de su aplicación:

Aquí es donde los desarrolladores nuevos en OAuth a veces se confunden un poco ... Google y Stack Overflow, Assembla, la aplicación web muy elegante y elegante de Vinesh son entidades diferentes, y Google no sabe nada sobre su cuenta en la aplicación web genial de Vinesh, y viceversa. viceversa, aparte de lo que se expone a través de la API que está utilizando para acceder a la información del perfil.

Cuando su usuario cierra sesión, él o ella no se desconecta de Google, él / ella está desconectando su aplicación, o Stack Overflow, o Assembla, o cualquier aplicación web que use Google OAuth para autenticar al usuario.

De hecho, puedo cerrar sesión en todas mis cuentas de Google y aún así iniciar sesión en Stack Overflow. Una vez que su aplicación sepa quién es el usuario, esa persona puede cerrar la sesión de Google. Google ya no es necesario.

Dicho esto, lo que está pidiendo hacer es desconectar al usuario de un servicio que realmente no le pertenece. Piénselo así: Como usuario, ¿qué tan molesto crees que estaría si iniciara sesión en 5 servicios diferentes con mi cuenta de Google, luego la primera vez que me desconecté de uno de ellos, tengo que iniciar sesión en mi cuenta de Gmail? nuevamente porque el desarrollador de la aplicación decidió que, cuando cierre la sesión de su aplicación, también debería cerrar la sesión de Google? Eso envejecerá muy rápido. En resumen, realmente no quieres hacer esto ...

Yeh yeh, lo que sea, todavía quiero desconectar al usuario de Google, solo dime ¿cómo hago esto?

Dicho esto, si aún desea cerrar la sesión de un usuario en Google y se da cuenta de que es muy posible que esté interrumpiendo su flujo de trabajo, puede crear dinámicamente la URL de cierre de sesión desde uno de los botones de cierre de sesión de los servicios de Google y luego invocarlo usando un elemento img o una etiqueta de 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";

Si redirige a su usuario a la página de cierre de sesión, o lo invoca desde un elemento que no está restringido entre dominios, el usuario cerrará la sesión de Google.

Tenga en cuenta que esto no significa necesariamente que se cerrará la sesión del usuario en su aplicación, solo en Google. :)

Resumen:

Lo que es importante que tenga en cuenta es que, cuando cierra la sesión de su aplicación, no es necesario que el usuario vuelva a ingresar una contraseña. ¡Ese es todo el punto! Se autentica contra Google para que el usuario no tenga que ingresar su contraseña una y otra vez en cada aplicación web que utiliza. Se necesita algo de tiempo para acostumbrarse, pero sepa que, siempre que el usuario esté conectado a Google, su aplicación no tiene que preocuparse por si el usuario es o no quien dice ser.

Tengo la misma implementación en un proyecto que tú, usando la información del perfil de Google con OAuth. Probé exactamente lo mismo que estás buscando probar, y realmente comenzó a enojar a la gente cuando tuvieron que iniciar sesión en Google una y otra vez, así que dejamos de desconectarlos de Google. :)

jmort253
fuente
8
Gracias por su valioso tiempo y una descripción tan amplia. Pero mi cliente tiene una opinión diferente. Supongamos que el usuario inicia sesión en la aplicación utilizando su inicio de sesión de Google desde un sistema público y cierra la sesión de la aplicación. Puede pensar que también se ha desconectado de Google, ¡pero en realidad no! Cualquier otro usuario que utilice el sistema posteriormente tendrá acceso a la cuenta de Google.
Vinesh EG
13
Entonces sus usuarios también deben cerrar la sesión de Google. El caso es que están iniciando sesión en 2 servicios. Sus usuarios deben aprender a usar OAuth. :) Sugeriría educar a su cliente y a los usuarios. Si es necesario, adelante y enséñeles. No debería llevar mucho tiempo implementarlo y luego deshacerlo más tarde cuando se dé cuenta de cuánto apesta. :) No lo creí por mí mismo hasta que hice esto y vi cuánto de un PITA era tener que volver a iniciar sesión en Google cada vez que salía de LoopToDo. Considere tal vez un mensaje "¡Ha cerrado sesión en la genial aplicación de Vinesh, no olvide> cerrar sesión también en Google <!"
jmort253
1
@ jmort253 Sí, entiendo que ya no necesitan proporcionar permisos, pero ¿cómo debo autenticarlos nuevamente? Por favor, vea esta pregunta que hice (todavía soy nuevo en OAuth): stackoverflow.com/questions/37515836/…
Apoorv Kansal
1
@ jmort253 Sin embargo, ¿qué pasa si para el usuario la palabra "desconectar" implica el cierre de sesión total de la aplicación? Debido a que vuelve a iniciar sesión automáticamente sin volver a escribir las credenciales, hay 2 problemas; el usuario se pregunta qué pasó. Acabo de desconectarme y no debería tener mi información y el segundo usuario no podrá iniciar sesión en una cuenta diferente porque siempre iniciará sesión automáticamente a menos que el proveedor de autenticación proporcione un método de inicio de sesión forzado. Entonces, en este caso, es conveniente cerrar la sesión para que pueda invalidar las cookies y ya no tenga que preocuparse por cómo se administra en el lado del cliente.
darewreck
1
Esto es útil para aplicaciones Electron, donde el usuario inició sesión con Google. En este caso, cerrar la sesión de Google los cierra en una sola aplicación (la aplicación Electron).
trusktr
21

Puede cerrar sesión y redirigir a su sitio:

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
fuente
1
¡Finalmente! ¡Gracias! He estado tratando durante todo un día para encontrar la manera de cierre de sesión, para evitar que el siguiente usuario que está registrado como usuario anterior con sólo un clic, sin saber el correo electrónico o la contraseña ...
algunos
1
No funciona, porque basta con abrir la misma página en otra pestaña, y estás conectado de nuevo ...
Bartłomiej Semańczyk
5

Para mí, funciona (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
}

Tienes que llamar a esta función en AsyncTask en Android

Vinoj John Hosan
fuente
2
Si bien es cierto que esto funcionaría, la pregunta en realidad es sobre JavaScript, no sobre Java.
jmort253
2
Suena extraño que todo lo que necesitas es un token, puedes forzar a Google a cerrar la sesión de todos por la fuerza.
Archimedes Trajano
No cerrará la sesión del dispositivo, solo cerrará la sesión de la aplicación (en Android).
Vinoj John Hosan
2
Al mirar algunos de los documentos de google oauth2, un token de acceso típico se ve así. "1 / fFAGRNJru1FTz70BzhT3Zg" Suponiendo que la parte "1 /" es solo para humanos para identificar el número más fácilmente. Aún tiene dos alfabetos (mayúsculas y minúsculas) más diez dígitos numéricos con una longitud de 22 caracteres. Eso es 22 ^ (26 * 2 + 10) que es igual a 1.6990502e + 83. O sobre la cantidad de átomos en el universo conocido . Buena suerte forzando eso a través de HTTP. ;)
Chris Balogh
Esto no parece revocar el token de actualización, que podría ser robado antes de eliminar las cookies (si está almacenado allí).
Ondrej Galbavý
1

Esto funciona para cerrar la sesión del usuario en la aplicación, pero no en Google.

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

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

CamHart
fuente
1
esto no cerrará completamente al usuario en su cuenta de Google. Solo destruye el AuthInstanceque usaste. Su propia fuente dice ... " Puede permitir que los usuarios
cierren
@RoshanaPitigala actualizó la respuesta para especificar. Esta respuesta es la respuesta al título de la pregunta, pero una vez que lee la pregunta con más detalles, comprende que el título estaba escrito incorrectamente. Esta respuesta funciona para cualquiera que lo haya hecho aquí de acuerdo con el título de la pregunta.
CamHart
1

Ouath simplemente hace que la instancia de Google sea nula, por lo tanto, lo excluye de Google. Así es como se hace la arquitectura. Cerrar sesión en Google, si cierra sesión en su aplicación es un trabajo sucio, pero no puede ayudar si el requisito estipula lo mismo. Por lo tanto, agregue lo siguiente a su función signOut (). Mi proyecto fue una aplicación Angular 6:

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

Aquí localhost: 4200 es la URL de mi aplicación. Si su página de inicio de sesión es xyz.com, introdúzcala.

Rahul Sharma
fuente
1

este código funcionará para cerrar sesión

    <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
fuente
1

Para cerrar sesión solo en la aplicación, pero no en 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.');
            });
        });
    });

Estoy usando arriba en mi código ReactJs.

Sunil Kumar Singh
fuente
0

Espero que podamos lograr esto almacenando el token en la sesión al iniciar sesión y acceder al token cuando hizo clic en cerrar sesión.

    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
fuente
0

Parece que Google recientemente rompió algo con sus cosas de revocación (ha comenzado a devolvernos 400 errores). Ahora tienes que llamar

auth2.disconnect ();

En nuestro caso, tenemos que esperar un par de segundos para que se complete la llamada de desconexión; de lo contrario, el código de inicio de sesión se volverá a autorizar antes de que se complete. Sería bueno si Google devolviera una promesa del método de desconexión.

Sean
fuente