web-dev-qa-db-fra.com

Firebase Auth - Obtenir l'identifiant du fournisseur

J'utilise le code suivant pour détecter le fournisseur d'authentification et me déconnecter correctement

static func logOut() {
    let auth = FIRAuth.auth()!
    let provider = auth.currentUser?.providerID
    switch provider! {
        case "Facebook": FBSDKLoginManager().logOut()
        case "Google": GIDSignIn.sharedInstance().signOut()
        case "Twitter": Twitter.sharedInstance().sessionStore.logOutUserID(TWTRAPIClient.withCurrentUser().userID!)
        default:
            print("Unknown provider ID: \(provider!)")
            return
    }
    try! auth.signOut()
}

Mais le fournisseur est toujours "Firebase". Qu'est-ce que je fais mal? 0_o Une fois que le code jette "Facebook" lorsque je me suis connecté à Twitter. Merci d'avance

UPD: Oui, je peux stocker le fournisseur d’authentification dans UserDefaults, mais c’est peut-être un bogue Firebase. J'utilise Firebase SDK 3.5.2 

14
Dima Rostopira

Puisqu'un utilisateur peut se connecter à son compte d'authentification Firebase avec plusieurs fournisseurs, l'ID de fournisseur de niveau supérieur sera maintenant (généralement) Firebase.

Mais le currentUser A UNE PROPRIÉTÉ providerData qui fournit des informations sur les fournisseurs spécifiques. Une boucle sur FIRAuth.auth()!.currentUser.providerData vous donnera le FIRUserInfo.providerID que vous cherchez.

Voir également cette question sur les UID, qui se trouvent dans une situation similaire: Firebase renvoie plusieurs ID, lequel est unique?

23
Frank van Puffelen

Swift 4 solution:

   if let providerData = Auth.auth().currentUser?.providerData {
        for userInfo in providerData {
            switch userInfo.providerID {
            case "facebook.com":
                print("user is signed in with facebook")
            case "google.com":
                print("user is signed in with google")
            default:
                print("user is signed in with \(userInfo.providerID)")
            }
        }
    }
7
Alessign

Pour vous déconnecter, il existe une méthode plus simple:

let authUI = FUIAuth.defaultAuthUI()
do {
    try authUI?.signOut()
} catch let err {
    print(err);
}

D'autre part, si vous souhaitez rechercher le fournisseur ET déterminer si l'utilisateur est connecté via ce fournisseur, vérifiez la méthode accessToken. Pour obtenir accessToken, vous avez besoin de l'instance de fournisseur spécifique que vous avez fournie aux fournisseurs. 

Je trouve que ceci est mieux réalisé en déclarant d’abord vos fournisseurs dans votre classe:

lazy var facebookProvider = FUIFacebookAuth()
lazy var googleProvider = FUIGoogleAuth()

Ensuite, lorsque vous fournissez les fournisseurs:

let providers: [FUIAuthProvider] = [ facebookProvider, googleProvider ]

Quand vous voulez les données de fournisseur spécifiques:

if let providerData = Auth.auth().currentUser?.providerData {
    for userInfo in providerData {
        switch userInfo.providerID {
        case "facebook.com":
            if !facebookProvider.accessToken.isEmpty {
                print("user is signed in with facebook")
            }
        case "google.com":
            if !googleProvider.accessToken.isEmpty {
                 print("user is signed in with google")
            }
        default:
            print("user is signed in with \(userInfo.providerID)")
        }
    }
}

Sinon, vous obtiendrez des informations sur chaque fournisseur, que l'utilisateur soit réellement connecté ou non.

0
David J