web-dev-qa-db-ger.com

So melden Sie sich von Google ab, nachdem Sie authentifiziert wurden

Meine App hat also die Möglichkeit, sich bei Google anzumelden. Durch Klicken auf die von Google bereitgestellte Schaltfläche wird eine Webansicht geöffnet, in der der Benutzer seine Anmeldeinformationen eingeben muss. Nachdem der App der Zugriff auf ihre Informationen ermöglicht wurde, meldet sie den Benutzer an und ändert den SignInViewController in den TabBarController (wo er nun entsprechend interagieren kann).

Wenn der Benutzer eine Abmelde-Schaltfläche drückt, wird er wie erwartet zum Anmeldebildschirm geleitet. Die seltsame Sache ist jedoch, wenn der Nutzer den Google-Button erneut drückt, wird er automatisch ohne weitere Authentifizierung und ohne die Möglichkeit, sein Konto zu entfernen, angemeldet. Ist es eine Möglichkeit, die Anmeldeinformationen des Google-Kontos zu löschen, um die Benutzer vor versehentlichem Diebstahl zu schützen?

Anmeldefunktion:

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)
    }
    // ...
}

Abmeldefunktion:

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

Swift

versuche GIDSignIn.sharedInstance().signOut() 

Ziel c

[[GIDSignIn sharedInstance] signOut];
42
Rahul Patel

Ja, wie @Rahul sagte, der folgende Code wäre der richtige Weg, um es zu tun.

GIDSignIn.sharedInstance().signOut()

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

10
Lazy
  public func logOut(on:UIViewController){

    let firebaseAuth = Auth.auth()
    do {
        try  firebaseAuth.signOut()
            GIDSignIn.sharedInstance().signOut()
            GIDSignIn.sharedInstance().disconnect()

        if let url = NSURL(string:  "https://www.google.com/accounts/Logout?continue=https://appengine.google.com/_ah/logout?continue=https://google.com"){
            UIApplication.shared.open(url as URL, options: [:]) { (true) in
                let appDel:AppDelegate = UIApplication.shared.delegate as! AppDelegate
                appDel.window?.rootViewController = LoginViewController()
            }
        }
    } catch let signOutError as NSError {
        Help.shared.Snack(messageString: "Error signing out: \(signOutError)" 
)
        print ("Error signing out: %@", signOutError)
    }
}
1

Wollte ein wenig auf die vorherigen Antworten eingehen, nachdem er mit dem GoogleSignIn-SDK gespielt hatte.

Ich sah die signOut()- und disconnect()-Methoden und fragte mich, was die Unterschiede waren.

signOut() ist ein synchroner Aufruf:

// 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() ermöglicht einem Benutzer, den Zugriff auf die App zusätzlich zum Abmelden zu widerrufen. Ich gehe davon aus, dass sie Ihrer App alle Berechtigungen erneut erteilen müssen, wenn sie sich erneut anmelden möchten. 

Laut Google-Entwicklerdokumente Wenn ein Nutzer disconnect von Ihrer App wählt, müssen Sie alle Google-Daten des Nutzers entfernen, die in Ihrer App gespeichert wurden.

Außerdem ist disconnect() asynchron. Das Ergebnis des Trennungsaufrufs wird an die GIDSignInDelegate.sign(_:didDisconnectWith:withError:)-Methode zurückgegeben.

// 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