2017-12-09 2 views
0

Ich benutze Firebase für die Google-Anmeldung in meiner App. Die Regeln erlauben nur die Anmeldung für meine Unternehmensdomäne. Wenn ich eine @ mydomain.com-Mail verwende, meldet sich der Benutzer korrekt an. Wenn ich versuche, mit einer anderen E-Mail melden Sie sich an, ich habe nur eine Nachricht in der Konsole wie folgt aus:Abfangen Firebase Login-Ereignis "fehlgeschlagen: permission_denied"

[Firebase/Database][-----] Listener at /user_profiles/... failed: permission_denied. 

aber die App bleibt auf der Login-View-Controller und nichts appens.

Es gibt eine Möglichkeit, diese Nachricht abzufangen, damit ich eine Warnung auf dem Bildschirm anzeigen kann?

my code in app delegate didFinishLaunchingWithOptions

Dies ist kein Login-Fehler, da gmail Login und Feuerbasis Login funktioniert und Fehler nie aufgerufen werden. Der Fehler ist ein Schreib/Lese-Fehler aufgrund meiner Einschränkung für die Unternehmensdomäne. Wo kann ich den Lese-/Schreibfehler behandeln?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
    // Override point for customization after application launch. 
    // Use Firebase library to configure APIs 
    FirebaseApp.configure() 

    GIDSignIn.sharedInstance().clientID = FirebaseApp.app()?.options.clientID 
    GIDSignIn.sharedInstance().delegate = self 
    return true 
} 

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { 

    return GIDSignIn.sharedInstance().handle(url, 
              sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String, 
              annotation: options[UIApplicationOpenURLOptionsKey.annotation]) 
} 

//let mainStoryboard: UIStoryboard = UIStoryboard(name:"Main", bundle: nil) 




func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) { 

    if let error = error { 
     print("error:") 
     print(error.localizedDescription) // never called 

     return 
    } 
    print("Gmail login - OK") 

    let authentication = user.authentication 
    let credential = GoogleAuthProvider.credential(withIDToken: (authentication?.idToken)!,accessToken: (authentication?.accessToken)!) 

    Auth.auth().signIn(with: credential) { (user, error) in 

     if let error = error { 
      print("error:") 
      print(error.localizedDescription) // never called 
      return 
     } 
     print("Firebase login - OK") 

     self.databaseRef = Database.database().reference() 
     self.databaseRef.child("user_profiles").child(user!.uid).observeSingleEvent(of: .value, with: { (snapshot) in 

      let snapshot = snapshot.value as? NSDictionary 

      if(snapshot == nil) { 
       self.databaseRef.child("user_profiles").child(user!.uid).child("name").setValue(user?.displayName) 
       self.databaseRef.child("user_profiles").child(user!.uid).child("email").setValue(user?.email) 
      } 


      self.window?.rootViewController?.performSegue(withIdentifier: "HomeViewSegue", sender: nil) 
     }) 
    } 
} 
+0

Dies wird durch Ihre Regeln verursacht - jedoch ohne Ihren Login-Code zu sehen, Firebase-Regeln und Struktur können wir nicht beantworten. Sie können jedoch Firebase-Fehler in einem Firebase-Abschluss nach einem Firebase-Aufruf behandeln. Viele haben einen Fehler var, der gesetzt ist, der den Fehler enthält. – Jay

+0

Ich habe den Beitrag mit meinem Code aktualisiert. Die Firebase-Schließungen werden nie aufgerufen, da der Login funktioniert. Wo kann ich den Lese-/Schreibfehler überprüfen? – Danilo

+0

Verschlüsse * Immer * ausführen, damit Sie beim Anmelden weitere Funktionen ausführen oder Fehler behandeln können. In Ihrem Fall wird dieser Fehler nicht durch die Anmeldung ausgelöst. Er wird aufgerufen, wenn Sie versuchen, auf einen Knoten zuzugreifen, dessen Regeln die Berechtigung verweigern. Diese Zeile * self.databaseRef.child ("user_profiles"). Child (user! .uid) .observeSingleEvent * löst den Fehler aus und es gibt keinen Fehlerbehandlungscode. Dieser Knoten hat die Auswertung für false gelesen, daher der Fehler. – Jay

Antwort

-1

Gelöst! Ich habe diese Überprüfung hinzugefügt:

+0

Dies ist wahrscheinlich keine gute Lösung, da es Ihnen den gleichen Fehler gibt wie den, den ich in meinem Kommentar zu Ihrer Frage angesprochen habe. Noch wichtiger ist: Wenn kein Fehler vorliegt, fügt dieser Code der gesamten Datenbank einen Observer hinzu, sodass alle untergeordneten Elemente hinzugefügt werden, an denen ein Ereignis auftritt. Das * BIG * Problem ist, dass wenn Sie 10.000 Knoten haben, dieser Code beim Start ohne Grund über jeden einzelnen Knoten in Ihrer gesamten Datenbank iteriert. Das wird wahrscheinlich die Dinge langsam VERRINGERN. – Jay

Verwandte Themen