4

Je construis un site web en utilisant Angular et Firebase. J'utilise les bibliothèques Angularfire2 et AngularFireAuth et GoogleAuthProvider (Google) comme fournisseur d'authentification.Comment se déconnecter de l'authentification Google après angularfire2/auth signOut?

Voici mon code de service:

import { Injectable } from '@angular/core'; 
import { Observable } from 'rxjs/Observable'; 
import { AngularFireAuth } from 'angularfire2/auth'; 
import * as firebase from 'firebase/app'; 

@Injectable() 
export class AuthenticationService { 
    user: Observable<firebase.User>; 

    constructor(public afAuth: AngularFireAuth) { 
    this.user = afAuth.authState; 
    } 

    login() { 
    this.afAuth.auth.signInWithPopup(new firebase.auth.GoogleAuthProvider()); 
    } 

    logout() { 
    this.afAuth.auth.signOut(); 
    } 
} 

Lorsqu'un utilisateur 'déconnecte' de mon site, cela fonctionne, mais semble 'cache' Google l'authentification. Donc, quand ils tentent de se connecter une seconde fois, je rencontre quelques problèmes:

  1. L'utilisateur ne peut pas choisir un autre compte Google avec lequel s'identifier.
  2. L'utilisateur est automatiquement connecté ... ce qui semble être un problème de sécurité. Un autre utilisateur peut accéder au même PC partagé et se connecter en tant qu'utilisateur précédent et n'est pas obligé de taper un mot de passe pour le faire.

Qu'est-ce que je fais mal? Y at-il un moyen que je peux arrêter angularfire2/auth de mettre en cache ces informations d'identification? Existe-t-il un moyen de déconnecter les utilisateurs de Google lorsqu'ils se déconnectent de mon site?

Répondre

2

Ceci est attendu car ce sont 2 systèmes distincts et chaque état Auth est stocké séparément. Firebase Auth signOut vous déconnecte de Firebase. Pour vous déconnecter de Google, vous devez vous connecter à Google et vous déconnecter. Si cela est essentiel pour votre application, vous pouvez toujours Firebase Auth déconnectez-vous, rediriger vers la page de fermeture de session Google:

auth.signOut().then(() => { 
    window.location.assign('https://accounts.google.com/Logout'); 
}, (error) => { 
    console.log(error); 
}); 
+2

Je vous remercie de votre réponse, et accepte cela est "comme prévu", mais je crois encore c'est une expérience d'utilisateur malheureuse. Je préférerais une option permettant de me connecter en utilisant les informations d'identification Google, mais PAS me connecter à Google en même temps. – szaske

0

Comme suggestion, vous pouvez le faire plus discrètement en suivant la « solution » à ce link . Je l'utilise dans mon application au cas où l'utilisateur n'est pas autorisé à accéder à la base de données, mais vous pouvez ajouter l'iframe n'importe où.

Service logout:

function LogoutService($location){ 
     this.logOut = function(myAuth){ 
      myAuth.$signOut().then(() => { 

       $location.path("/logout"); 

      }, (error) => { 
       console.log(error); 
      }); 
     }; 
    }; 
routeur

:

.when('/logout', { 
      templateUrl : "login/logout.html" 
     }) 

logout.html:

<div class="container" > 

<p >{{logUser.unauthUser}} unauthorized. Try again.</p> 

<iframe id="logoutframe" src="https://accounts.google.com/logout" style="display: none"></iframe> 

</div>