web-dev-qa-db-fra.com

Firebase - La suppression et la réinstallation de l'application n'annule pas l'authentification d'un utilisateur

Après avoir authentifié un utilisateur avec le code suivant (ci-dessous est une version tronquée de mon code, donc seule la logique de connexion réussie est affichée) ...

let firebaseReference = Firebase(url: "https://MY-FIREBASE.firebaseio.com")

FBSession.openActiveSessionWithReadPermissions(["public_profile", "user_friends"], allowLoginUI: true,
    completionHandler: { session, state, error in

        if state == FBSessionState.Open {
            let accessToken = session.accessTokenData.accessToken
            firebaseReference.authWithOAuthProvider("facebook", token: accessToken,
                withCompletionBlock: { error, authData in

                    if error != nil {
                        // Login failed.
                    } else {
                        // Logged in!
                        println("Logged in! \(authData)")
                    }
            })
        }
    })
}

(Par exemple, lancement et exécution de l'application, connexion réussie).

Si vous supprimez ensuite l'application et la réinstallez sur le même appareil, cet appel - que j'utilise dans le délégué de l'application pour déterminer si un utilisateur est connecté - retournera toujours qu'il est connecté.

if firebaseReference.authData == nil {
    // Not logged in
} else {
    // Logged in
}

Pourquoi donc? J'aurais pensé que la suppression de l'application et sa réinstallation devraient effacer toutes les données.

Si vous réinitialisez le contenu et les paramètres dans le simulateur iOS et installez l'application, la propriété firebaseReference.authData Redeviendra nil.

37
Jon Cox

La session d'authentification Firebase est conservée sur l'appareil de l'utilisateur dans le trousseau iOS. Les données du trousseau de l'application ne sont pas supprimées lorsque l'application est désinstallée.

Si vous cherchez à effacer manuellement les données, vous pouvez stocker des métadonnées supplémentaires avec votre application et appeler manuellement FirebaseRef.unauth() pour effacer la session persistante. Voir # 4747404: Supprimer les éléments du trousseau lorsqu'une application est désinstallée pour une référence supplémentaire.

44
Rob DiMarco

L'ajout de code ci-dessous à la fin de la fonction didFinishLaunchingWithOptions (avant de retourner true) d'AppDelegate fonctionne rapidement.

let userDefaults = NSUserDefaults.standardUserDefaults()
if userDefaults.valueForKey("appFirstTimeOpend") == nil {
    //if app is first time opened then it will be nil
    userDefaults.setValue(true, forKey: "appFirstTimeOpend")
    // signOut from FIRAuth
    do {
        try FIRAuth.auth()?.signOut()
    }catch {

    }
    // go to beginning of app
} else {
   //go to where you want
}
21
Dari

Pour Swift 4 la même réponse:

let userDefaults = UserDefaults.standard
if userDefaults.value(forKey: "appFirstTimeOpend") == nil {
    //if app is first time opened then it will be nil
    userDefaults.setValue(true, forKey: "appFirstTimeOpend")
    // signOut from FIRAuth
    do {
        try Auth.auth().signOut()
    }catch {

    }
    // go to beginning of app
} else {
    //go to where you want
}
7
Shubham Tomar

Utilisez l'extension ci-dessous:

extension AppDelegate{
func signOutOldUser(){
    if let _ = UserDefaults.standard.value(forKey: "isNewuser"){}else{
        do{
            UserDefaults.standard.set(true, forKey: "isNewuser")
            try Auth.auth().signOut()
        }catch{}
    }
} 
}

et appelez cela dans la méthode '... didFinishLaunchingWithOptions ...' d'Appdelegate:

   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    FirebaseApp.configure()
    signOutOldUser()
    return true
}
3
Surendra Kumar