Comment se déconnecter d'une application où j'ai utilisé OAuth2 pour me connecter avec Google?

84

Dans mon application, j'ai implémenté la déconnexion de Google à l'aide de jsapi.

J'ai utilisé l'url https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=xxxxxx pour me connecter à Google, puis https://www.googleapis.com/plus/v1/people/xxxxxx pour obtenir les données utilisateur à partir du profil google.

Je dois maintenant déconnecter l'utilisateur de Google en cliquant sur un bouton de mon application. Comment puis-je implémenter cela dans JavaScript, ou du moins il doit demander la page de connexion Google chaque fois que l'utilisateur se connecte

J'ai essayé approval_prompt=force, mais semble ne pas fonctionner.

Vinesh EG
la source

Réponses:

243

Présentation d'OAuth: l'utilisateur est-il celui qu'il dit être?:

Je ne sais pas si vous avez utilisé OAuth pour vous connecter à Stack Overflow, comme l'option "Se connecter avec Google", mais lorsque vous utilisez cette fonctionnalité, Stack Overflow demande simplement à Google s'il sait qui vous êtes:

"Yo Google, ce type de Vinesh prétend que [email protected] est lui, est-ce vrai?"

Si vous êtes déjà connecté, Google dira OUI. Sinon, Google dira:

"Attendez une seconde Stack Overflow, je vais authentifier ce type et s'il peut entrer le bon mot de passe pour son compte Google, alors c'est lui".

Lorsque vous entrez votre mot de passe Google, Google indique à Stack Overflow que vous êtes qui vous prétendez être et Stack Overflow vous connecte.

Lorsque vous vous déconnectez de votre application, vous vous déconnectez de votre application:

Voici où les développeurs novices dans OAuth sont parfois un peu confus ... Google et Stack Overflow, Assembla, Vinesh's-very-cool-slick-webapp, sont toutes des entités différentes, et Google ne sait rien de votre compte sur l'application Web cool de Vinesh, et vice versa, mis à part ce qui est exposé via l'API que vous utilisez pour accéder aux informations de profil.

Lorsque votre utilisateur se déconnecte, il ne se déconnecte pas de Google, il se déconnecte de votre application, de Stack Overflow, d'Assembla ou de toute autre application Web qui a utilisé Google OAuth pour authentifier l'utilisateur.

En fait, je peux me déconnecter de tous mes comptes Google tout en restant connecté à Stack Overflow. Une fois que votre application sait qui est l'utilisateur, cette personne peut se déconnecter de Google. Google n'est plus nécessaire.

Cela dit, ce que vous demandez, c'est de déconnecter l'utilisateur d'un service qui ne vous appartient vraiment pas. Pensez-y comme ceci: en tant qu'utilisateur, à quel point pensez-vous que je serais ennuyé si je me connectais à 5 services différents avec mon compte Google, puis la première fois que je me suis déconnecté de l'un d'entre eux, je dois me connecter à mon compte Gmail encore une fois parce que le développeur de l'application a décidé que, lorsque je me déconnecterais de son application, je devais également être déconnecté de Google? Cela va vieillir très vite. En bref, vous ne voulez vraiment pas faire ça ...

Ouais, peu importe, je veux toujours déconnecter l'utilisateur de Google, dis-moi simplement comment faire?

Cela dit, si vous souhaitez toujours déconnecter un utilisateur de Google et que vous réalisez que vous risquez très bien de perturber son flux de travail, vous pouvez créer dynamiquement l'URL de déconnexion à partir de l'un de leurs boutons de déconnexion des services Google, puis l'invoquer en utilisant un élément img ou une balise de script:

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

OU

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

OU

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

Si vous redirigez votre utilisateur vers la page de déconnexion ou que vous l'invoquez à partir d'un élément qui n'est pas restreint à plusieurs domaines, l'utilisateur sera déconnecté de Google.

Notez que cela ne signifie pas nécessairement que l'utilisateur sera déconnecté de votre application, uniquement Google. :)

Sommaire:

Il est important que vous gardiez à l'esprit que, lorsque vous vous déconnectez de votre application, vous n'avez pas besoin de forcer l'utilisateur à saisir à nouveau un mot de passe. Exactement! Il s'authentifie auprès de Google afin que l'utilisateur n'ait pas à saisir son mot de passe encore et encore et encore dans chaque application Web qu'il utilise. Il faut un certain temps pour s'y habituer, mais sachez que, tant que l'utilisateur est connecté à Google, votre application n'a pas à se soucier de savoir si l'utilisateur est ou non celui qu'il dit être.

J'ai la même implémentation dans un projet que vous, en utilisant les informations de profil Google avec OAuth. J'ai essayé la même chose que vous cherchez à essayer, et cela a vraiment commencé à mettre les gens en colère lorsqu'ils devaient se connecter à Google encore et encore, alors nous avons arrêté de les déconnecter de Google. :)

jmort253
la source
8
Merci pour votre temps précieux et une si grande description. Mais mon client a une opinion différente. Supposons que l'utilisateur se connecte à l'application en utilisant sa connexion google à partir d'un système public et se déconnecte de l'application. Il peut penser qu'il s'est déconnecté de Google aussi, mais en fait pas! Tout autre utilisateur utilisant le système plus tard aura accès au compte Google.
Vinesh EG
12
Ensuite, vos utilisateurs doivent également se déconnecter de Google. Le fait est qu'ils se connectent à 2 services. Vos utilisateurs doivent apprendre à utiliser OAuth. :) Je suggère d'éduquer votre client et les utilisateurs. Si vous devez le faire, allez-y et montrez-leur. La mise en œuvre ne devrait pas prendre longtemps, puis l'annulation plus tard lorsque vous réalisez à quel point cela craint. :) Je ne le croyais pas moi-même jusqu'à ce que je fasse cela et que je sache à quel point il fallait me reconnecter à Google à chaque fois que je me déconnectais de LoopToDo. Considérez peut-être un message "Vous êtes déconnecté de l'application cool de Vinesh, n'oubliez pas de> vous déconnecter également de Google <!"
jmort253
1
@ jmort253 Oui, je comprends qu'ils n'ont plus besoin de fournir des autorisations, mais comment dois-je les authentifier à nouveau? S'il vous plaît voir cette question que j'ai posée (je suis encore nouveau sur OAuth): stackoverflow.com/questions/37515836/…
Apoorv Kansal
1
@ jmort253 Cependant, que se passe-t-il si pour l'utilisateur le mot «déconnecter» implique une déconnexion totale de l'application. Puisqu'il se reconnecte automatiquement sans avoir à saisir à nouveau les informations d'identification, il y a 2 problèmes; l'utilisateur se demande ce qui se passe, je viens de me déconnecter et il ne devrait pas avoir mes informations et le deuxième utilisateur ne pourra pas se connecter à un autre compte car il se connectera toujours automatiquement à moins que le fournisseur d'authentification ne fournisse une méthode de connexion forcée. Donc, dans ce cas, la déconnexion est souhaitable afin qu'elle puisse invalider les cookies et que vous n'ayez plus à vous soucier de la façon dont ils sont gérés côté client.
darewreck
1
Ceci est utile pour les applications Electron, où l'utilisateur s'est connecté avec Google! Dans ce cas, leur déconnexion de Google les déconnecte d'une seule application (l'application Electron).
trusktr
21

Vous pouvez vous déconnecter et rediriger vers votre site:

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
la source
1
Finalement! Merci! J'ai essayé pendant une journée entière de trouver comment me déconnecter, pour empêcher le prochain utilisateur de se connecter en tant qu'utilisateur précédent par un simple clic, sans connaître l'e-mail ou le mot de passe ...
du
1
Cela ne fonctionne pas, car il suffit d'ouvrir la même page dans un autre onglet, et vous êtes à nouveau connecté ...
Bartłomiej Semańczyk
5

Pour moi, ça marche (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
}

Vous devez appeler cette fonction dans AsyncTask sous Android

Vinoj John Hosan
la source
2
S'il est vrai que cela fonctionnerait, la question concerne en fait JavaScript, pas Java.
jmort253
2
Cela semble bizarre que tout ce dont vous avez besoin est un jeton, vous pouvez forcer Google à se déconnecter de force tout le monde.
Archimedes Trajano
Il ne vous déconnectera pas de l'appareil, il ne déconnectera que l'application (sous Android).
Vinoj John Hosan
2
En regardant certains des documents google oauth2, un jeton d'accès typique ressemble à ceci. "1 / fFAGRNJru1FTz70BzhT3Zg" En supposant que la partie "1 /" est juste pour que les humains identifient le numéro plus facilement. Vous avez toujours deux alphabets (majuscules et minuscules) plus dix chiffres numériques d'une longueur de 22 caractères. C'est 22 ^ (26 * 2 + 10) ce qui équivaut à 1,6990502e + 83. Ou sur le nombre d'atomes dans l'univers connu . Bonne chance brute forçant cela sur HTTP. ;)
Chris Balogh
Cela ne semble pas révoquer le jeton d'actualisation, qui pourrait être volé avant la suppression des cookies (s'il y est stocké).
Ondrej Galbavý
1

Cela fonctionne pour déconnecter l'utilisateur de l'application, mais pas Google.

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

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

CamHart
la source
1
cela ne déconnectera pas complètement l'utilisateur de son compte Google. Il détruit uniquement celui AuthInstanceque vous avez utilisé. Votre source elle-même dit ... " Vous pouvez permettre aux utilisateurs de se déconnecter de votre application sans se déconnecter de Google ... "
Roshana Pitigala
@RoshanaPitigala a mis à jour la réponse pour spécifier. Cette réponse est la réponse au titre de la question, mais une fois que vous lisez la question plus en détail, vous comprenez que le titre a été mal écrit. Cette réponse fonctionne pour tous ceux qui l'ont fait ici selon le titre de la question.
CamHart
1

Ouath rend simplement l'instance Google nulle, donc vous sortez de Google. Voilà comment l'architecture est faite. Se déconnecter de Google, si vous vous déconnectez de votre application est un sale boulot, mais ne peut pas vous empêcher si l'exigence le stipule. Ajoutez donc ce qui suit à votre fonction signOut (). Mon projet était une application Angular 6:

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

Ici localhost: 4200 est l'URL de mon application. Si votre page de connexion est xyz.com, saisissez-la.

Rahul Sharma
la source
1

ce code fonctionnera pour vous déconnecter

    <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
la source
1

Pour vous déconnecter de l'application uniquement mais pas de 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.');
            });
        });
    });

J'utilise ci-dessus dans mon code ReactJs.

Sunil Kumar Singh
la source
0

J'espère que nous pouvons y parvenir en stockant le jeton en session lors de la connexion et en accédant au jeton lorsqu'il a cliqué sur la déconnexion.

    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
la source
0

Il semble que Google a récemment cassé quelque chose avec ses éléments de révocation (il a commencé à renvoyer 400 erreurs pour nous). Vous devez maintenant appeler

auth2.disconnect ();

Dans notre cas, nous devons ensuite attendre quelques secondes pour que l'appel de déconnexion se termine, sinon le code de connexion sera réautorisé avant la fin. Ce serait bien si Google retournait une promesse de la méthode de déconnexion.

Sean
la source