2015-11-09 4 views
1

Dans l'écran de gestion, l'authentification par courriel et la connexion anonyme sont activées. Les données ont un seul nœud - Bonjour: « Monde »Authentification par courrier électronique Firebase avec des règles ne fonctionnant pas comme prévu

La règle que j'ai est

{ 
     "rules": {   
     ".read": "auth != null", 
     //".read": true, 
     ".write": true 

     } 
} 

Si l'utilisateur n'est pas connecté à la règle ci-dessus vous La lecture a échoué: Permission refusé Tout est bon.

Si un utilisateur anonyme est connecté, je peux voir la valeur "{Hello = World"} Fonctionne jusqu'à présent.

Si je me connecte avec un utilisateur de messagerie le je reçois une erreur: FirebaseError: Autorisation refusée

Le OnAuthenticate ne déclenche et je reçois: ID utilisateur: 3c6ce912-A05A-49ed-ae68-8ec97d022303, Fournisseur: mot de passe

Le code complet est ci-dessous. Qu'est-ce que je fais mal?

import com.firebase.client.AuthData; 
import com.firebase.client.DataSnapshot; 
import com.firebase.client.Firebase; 
import com.firebase.client.FirebaseError; 
import com.firebase.client.ValueEventListener; 
import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class FirebaseTest { 

Firebase ref = new Firebase("https://<FIREBASE NAME>.firebaseio.com/"); 

public FirebaseTest() { 

    //logonAnonymous(); //works 
    logonEmail(); //permission denied 

    showValues();   

    try { 
     System.out.println("Waiting for input");    
    System.in.read(); 
    } catch (IOException ex) { 
     Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

private void logonAnonymous() { 
    ref.authAnonymously(new Firebase.AuthResultHandler() { 
     @Override 
     public void onAuthenticated(AuthData authData) { 
      // we've authenticated this session with your Firebase app 
      System.out.println("User ID: " + authData.getUid() + ", Provider: " + authData.getProvider()); 
     } 

     @Override 
     public void onAuthenticationError(FirebaseError firebaseError) { 
      // there was an error 
      System.out.println("Anon user auth error " + firebaseError.toString()); 

     } 
    }); 
} 

private void logonEmail() { 

    ref.authWithPassword("[email protected]", "secret", new Firebase.AuthResultHandler() { 
     @Override 
     public void onAuthenticated(AuthData authData) { 
      System.out.println("User ID: " + authData.getUid() + ", Provider: " + authData.getProvider()); 
     } 

     @Override 
     public void onAuthenticationError(FirebaseError firebaseError) { 
      // there was an error 
     } 
    }); 
} 

public void showValues() { 

    ref.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot snapshot) { 
      System.out.println(" value -" + snapshot.getValue()); 
     } 

     @Override 
     public void onCancelled(FirebaseError firebaseError) { 
      System.out.println("The read failed: " + firebaseError.getMessage()); 
     } 
    }); 
} 

}

Répondre

3

Je suis sûr que vous êtes juste de voir les effets du fait que le courrier électronique + authentification par mot de passe arrive de manière asynchrone.

Dans cette séquence:

logonEmail(); 
showValues();   

L'authentification ne seront pas encore fini le temps showValues() exécute.

La solution pour la commande asynchrone est simple, mais d'abord très peu intuitive: vous devez vous assurer que showValues() exécute uniquement après l'authentification a réussi.

Une façon simple de le faire:

private void logonEmail() { 

    ref.authWithPassword("[email protected]", "secret", new Firebase.AuthResultHandler() { 
     @Override 
     public void onAuthenticated(AuthData authData) { 
      System.out.println("User ID: " + authData.getUid() + ", Provider: " + authData.getProvider()); 

      // The user has been authenticated, so we can now safely call showValue() 
      showValues(); 
     } 

     @Override 
     public void onAuthenticationError(FirebaseError firebaseError) { 
      // there was an error 
     } 
    }); 
} 
+0

Voir aussi d'autres Frank, [très instructif, réponse sur callbacks async] (http://stackoverflow.com/questions/27049342/asynchronous-access-to- un-array-in-firebase/27050749 # 27050749). – Kato

+0

Merci, ça a marché! – VladimirSD