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
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?
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)")
}
}
}
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.