Ich verwende den folgenden Code, um den Authentifizierungsanbieter zu erkennen und sich ordnungsgemäß abzumelden
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()
}
Anbieter ist aber immer "Firebase". Was mache ich falsch? 0_o Einmal diesen Code werfen "Facebook", als ich bei Twitter eingeloggt war. Danke im Voraus
UPD: Ja, ich kann eigentlich einen Auth-Provider in UserDefaults
speichern, aber vielleicht handelt es sich um einen Firebase-Fehler. Ich verwende Firebase SDK 3.5.2
Da sich ein Benutzer bei seinem Firebase-Authentifizierungskonto bei mehreren Anbietern anmelden kann, lautet die Provider-ID der obersten Ebene jetzt (normalerweise) Firebase
.
Die currentUser
hat jedoch eine providerData
-Eigenschaft , die Informationen zu den jeweiligen Providern liefert. Wenn Sie über FIRAuth.auth()!.currentUser.providerData
gehen, erhalten Sie den gewünschten FIRUserInfo.providerID
, den Sie suchen.
Siehe auch diese Frage zu UIDs, die sich in einer ähnlichen Situation befinden: Firebase gibt mehrere IDs zurück. Welche ist eindeutig?
Swift 4 Lösung:
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)")
}
}
}
Um sich abzumelden gibt es eine einfachere Methode:
let authUI = FUIAuth.defaultAuthUI()
do {
try authUI?.signOut()
} catch let err {
print(err);
}
Wenn Sie den Provider suchen und feststellen möchten, ob der Benutzer über diesen Provider angemeldet ist, überprüfen Sie das accessToken. Um das accessToken zu erhalten, benötigen Sie die spezifische Provider-Instanz, die Sie Providers zur Verfügung gestellt haben.
Ich finde, dass dies am besten erreicht wird, wenn Sie Ihre Anbieter in Ihrer Klasse zuerst folgendermaßen deklarieren:
lazy var facebookProvider = FUIFacebookAuth()
lazy var googleProvider = FUIGoogleAuth()
Dann, wenn Sie die Anbieter bereitstellen:
let providers: [FUIAuthProvider] = [ facebookProvider, googleProvider ]
Wenn Sie die spezifischen Anbieterdaten wünschen:
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)")
}
}
}
Ansonsten erhalten Sie Informationen zu jedem Anbieter, unabhängig davon, ob der Benutzer tatsächlich angemeldet ist.
Ich musste JSON.stringify(currentUser.providerData)
, um zu sehen, wie es organisiert ist:
Und ich fand endlich die Auth Provider
so was:
currentUser.providerData[0].providerId
Prost, gl mit deinem Code :)