web-dev-qa-db-fra.com

Comment se déconnecter de Google après son authentification

Donc, mon application a la possibilité de se connecter avec Google. Lorsque vous cliquez sur le bouton fourni par Google, une vue Web s'ouvre et invite l'utilisateur à saisir ses informations d'identification. Après avoir autorisé l'application à accéder à leurs informations, l'application connecte l'utilisateur et modifie le SignInViewController en TabBarController (où ils peuvent désormais interagir en conséquence).

Lorsque l'utilisateur appuie sur un bouton de déconnexion, il est dirigé vers l'écran de connexion comme on peut s'y attendre. Mais ce qui est étrange, c’est que si l’utilisateur appuie à nouveau sur le bouton Google, il est automatiquement connecté, sans autre authentification ni possibilité de supprimer son compte. S'agit-il d'un moyen de supprimer les informations d'identification du compte Google afin de protéger les utilisateurs contre le vol accidentel?

Fonction de connexion:

func signIn(signIn: GIDSignIn!, didSignInForUser user: GIDGoogleUser!, withError error: NSError!) {
    if let error = error {
        print(error.localizedDescription)
        return
    }
    let authentication = user.authentication
    let credential = FIRGoogleAuthProvider.credentialWithIDToken(authentication.idToken, accessToken: authentication.accessToken)
    FIRAuth.auth()?.signInWithCredential(credential) { (user, error) in
        // ...
        SignInViewController().signedIn(user)
    }
    // ...
}

Fonction de déconnexion:

func signOutOverride() {
    do {
        try! FIRAuth.auth()!.signOut()
        CredentialState.sharedInstance.signedIn = false
        // Set the view to the login screen after signing out
        let storyboard = UIStoryboard(name: "SignIn", bundle: nil)
        let loginVC = storyboard.instantiateViewControllerWithIdentifier("SignInVC") as! SignInViewController
        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        appDelegate.window?.rootViewController = loginVC
    } catch let signOutError as NSError {
        print ("Error signing out: \(signOutError)")
    }
}
19
About7Deaths

Rapide

essayez GIDSignIn.sharedInstance().signOut() 

objectif c

[[GIDSignIn sharedInstance] signOut];
42
Rahul Patel

Oui, comme @Rahul a dit que suivre le code serait la bonne façon de procéder.

GIDSignIn.sharedInstance().signOut()

https://developers.google.com/identity/sign-in/ios/sign-in?ver=Swift#sign_out_the_user

10
Lazy

Je voulais élaborer un peu sur les réponses précédentes après avoir joué avec le SDK GoogleSignIn.

J'ai vu les méthodes signOut() et disconnect() et je me demandais quelles étaient les différences.

signOut() est un appel synchrone:

// Immediately sets GIDSignIn.sharedInstance()?.currentUser to nil. 
// For example, if the user is already signed in:

print(GIDSignIn.sharedInstance()?.currentUser != nil) // true - signed in
GIDSignIn.sharedInstance()?.signOut()
print(GIDSignIn.sharedInstance()?.currentUser != nil) // false - signed out

disconnect() permet à un utilisateur de révoquer l'accès à l'application en plus pour se déconnecter. Je suppose que cela signifie qu'ils devront redonner toute autorisation à votre application s'ils choisissent de se connecter à nouveau. 

Selon Documents Google pour les développeurs si un utilisateur choisit de déconnecter de votre application, vous devrez supprimer toutes les données Google de l'utilisateur qui ont été stockées dans votre application.

De plus, disconnect() est asynchrone. Le résultat de l'appel de déconnexion sera renvoyé à la méthode GIDSignInDelegate.sign(_:didDisconnectWith:withError:).

// Also sets GIDSignIn.sharedInstance()?.currentUser to nil. 
// Asynchronous call. If for example the user was already signed in:

print(GIDSignIn.sharedInstance()?.currentUser != nil) // true - signed in
GIDSignIn.sharedInstance()?.disconnect()
print(GIDSignIn.sharedInstance()?.currentUser != nil) // true - still signed in

// MARK: - GIDSignInDelegate
func sign(_ signIn: GIDSignIn!, didDisconnectWith user: GIDGoogleUser!, withError error: Error!) {
    print(GIDSignIn.sharedInstance()?.currentUser != nil) // false - signed out

    // Remove any data saved to your app obtained from Google's APIs for this user.
}
0
orangemako