2016-07-28 11 views
2

Ich habe Firebase-Authentifizierung für meine iOS-App mit Facebook, Google & E-Mail/Passwort anmelden und es funktioniert alles in Ordnung. Diese Authentifizierung findet nur statt, wenn der Benutzer auf Teile mit hoher Priorität meiner App zugreifen möchte (d. H. Ich muss die Benutzer nicht anmelden, um die App zu verwenden).Firebase-Authentifizierung: Verknüpfung mehrerer Konten in Swift

Beim Start der App signiere ich die Benutzer anonym im Hintergrund und das funktioniert auch gut.

Ich habe die documentation gelesen, aber ich bin zu kämpfen, den Code verstehen erforderlich, damit ich ein anonymes Konto auf einen Facebook/E-Mail-Konto in dem folgenden Fluss unterzeichnet verknüpfen:

  • neue Benutzer öffnen App
  • Benutzer anonym im Hintergrund (neu user.uid „A“ erstellt)
  • niedriger Priorität gespeicherten Daten gegen anonyme Benutzer in Echtzeit DB Firebase
  • Benutzer trifft ein hoher Priorität Bereich so muss angemeldet authentifizieren
  • Benutzer Zeichen Facebook (neu user.uid "B" erstellt) in mit
  • vorherigen user.uid "A" verknüpft werden muss, um user.uid "B"

Meine Methode wie zur Zeit aussieht dies:

func signupWithFacebook(){ 
    // track the anonymous user to link later 
    let prevUser = FIRAuth.auth()?.currentUser 

    FBSDKLoginManager().logInWithReadPermissions(["public_profile", "email"], fromViewController: self) { (result, error) in 
     if let token = result?.token?.tokenString { 
      let credential = FIRFacebookAuthProvider.credentialWithAccessToken(token) 

      FIRAuth.auth()?.signInWithCredential(credential, completion: { (user, error) in 
       if user != nil && error == nil { 
        // Success 
        self.success?(user: user!) 
        dispatch_async(dispatch_get_main_queue(), { 
         self.dismissViewControllerAnimated(true, completion: nil) 
        }) 

       } 
      }) 
     } 
    } 
} 

Alle Hinweise, um die Verwirrung zu entfernen wäre großartig.


UPDATE: Ich habe erkannt, ich, weil der Benutzer verwirrt über die App-Logik war während des Tests erstellt werden. Anstatt zwei separate Benutzer für das obige Szenario zu erstellen (eines, das über Facebook und ein anderes anonym authentifiziert wurde), passiert nur, dass das ursprüngliche anonyme Benutzer.UID "A" mit einigen Facebook-Authentifizierungsdaten "verknüpft" ist. In der Firebase-Konsole wird dies durch die anonyme uid angezeigt, die von anonym zu einem mit dem Facebook-Logo daneben wechselt.

Dies ist, was meine Arbeitsweise wie folgt aussieht:

func signupWithFacebook(){ 
    FBSDKLoginManager().logInWithReadPermissions(["public_profile", "email"], fromViewController: self) { (result, error) in 
     if let token = result?.token?.tokenString { 
      let credential = FIRFacebookAuthProvider.credentialWithAccessToken(token) 

      FIRAuth.auth()?.currentUser!.linkWithCredential(credential) { (user, error) in 
       if user != nil && error == nil { 
        // Success 
        self.success?(user: user!) 
        dispatch_async(dispatch_get_main_queue(), { 
         self.dismissViewControllerAnimated(true, completion: nil) 
        }) 
       } else { 
        print("linkWithCredential error:", error) 
       } 
      } 
     } 
    } 
} 
+0

Um Feuerbasis-Authentifizierung verwenden sie eine E-Mail/Passwort oder facebook/gmail Authentifizierung erfordert. Wie authentifizieren Sie sich anonym? – NSGangster

+0

Ok. Lesen Sie die Dokumentation durch und sie haben sie seit der letzten Nutzung der Firebase ein wenig verändert. Ich werde es mir ansehen. – NSGangster

+0

@ NSGangster Ich benutze 'FIRAuth.auth() ?. signInAnonymouslyWithCompletion()' von https://firebase.google.com/docs/auth/ios/anonymous-auth – James

Antwort

4

So folgt der Code die ersten 2 Schritte in this Link. Aber die Dokumentation sagt ausdrücklich nicht signInWithCredential zu nennen, sondern rufen

FIRAuth.auth()?.currentUser.linkWithCredential(credential) { (user, error) in 
    // ... 
} 

Nach Ihren Anmeldeinformationen von Facebook-SDK zu bekommen.

Zitat von Link: "If the call to linkWithCredential:completion: succeeds, the user's new account can access the anonymous account's Firebase data."

+0

Danke dafür. Wie ich in meinem Q erwähnt habe, bin ich verwirrt. Ich habe mich sehr verwirrt, weil ich während des Testens Benutzer erstellt habe, indem ich mich direkt mit Facebook authentifiziert habe (ohne anonyme Benutzer zu sein).Als Ergebnis war meine Logik, zwei Firebase-Benutzer (Facebook & anonym) für die gleiche Person zu haben und zu versuchen, die beiden _users_ zu verbinden. Tatsächlich passiert (wie in Ihrer Antwort/den Dokumenten geschrieben), dass Sie nur die _credentials_ (an den ursprünglichen anonymen Benutzer) verknüpfen und es wird nur ein einziger Benutzer erstellt. Scheint jetzt klar zu sein (und zu arbeiten!). Danke - Puh! – James

+0

@NSGangster signInWithCredential dient zum erstmaligen Authentifizieren des Benutzers und linkWithCredential ist für Benutzer, die bereits authentifiziert sind! Habe ich recht?? –

+1

Ich bekomme nicht wann zu versuchen, LinkCredential zu verbinden. Angenommen, Benutzer A erstellt ein Konto mit E-Mail-Adresse und Kennwort. Dann meldet er sich ab. Dann beschließt er sich mit Facebook einzuloggen. Ist es möglich zu verknüpfen? Oder ist es nur möglich, einen Benutzer mit Methode A zu signieren und dann, während Sie angemeldet sind, Methode B zu verknüpfen? Ich versuche zu vermeiden, dass mehrere Konten erstellt werden. Aus UX-Perspektive können Sie sich nicht darauf verlassen, dass Benutzer Konten verknüpfen. Es muss eine Möglichkeit geben, einen Benutzer abzumelden und sich dann mit einer neuen Methode wieder anzumelden. –

Verwandte Themen