wake-up-neo.com

Firebase Auth - Anbieter-ID erhalten

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 

14
Dima Rostopira

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?

23

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)")
            }
        }
    }
7
Alessign

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.

0
David J

Ich musste JSON.stringify(currentUser.providerData), um zu sehen, wie es organisiert ist:

Stringify result

Und ich fand endlich die Auth Provider so was:

currentUser.providerData[0].providerId

Prost, gl mit deinem Code :)