2015-11-09 1 views
1

На экране управления у меня есть авторизация электронной почты и анонимный вход. данные есть только один узел - Hello: «Мир»Проверка подлинности электронной почты Firebase с правилами, которые не работают должным образом

правило, что у меня есть

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

     } 
} 

Если пользователь не вошел в систему с указанным выше правилом, то вы получите Сбой чтения: Разрешение denied Это все хорошо.

Если анонимный пользователь зарегистрирован, тогда я могу увидеть значение «{Hello = World»} Работает до сих пор.

Если я войти с пользователем сообщения электронной почты я получаю сообщение об ошибке: FirebaseError: Отказано в

'' OnAuthenticate делает курок, и я получаю: ID Пользователь: 3c6ce912-a05a-49ed-ae68-8ec97d022303, Поставщик услуг: пароль

Полный код приведен ниже. Что я делаю не так?

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()); 
     } 
    }); 
} 

}

ответ

3

Я уверен, что вы просто видите последствия того, что электронная почта + пароль аутентификации происходит асинхронно.

В этой последовательности:

logonEmail(); 
showValues();   

аутентификации не будет еще закончили к тому времени showValues() выполняет.

Решение для асинхронного упорядочения является простым, но изначально очень неинтуитивным: вы должны убедиться, что showValues() выполняет только после аутентификация преуспела.

Простой способ сделать это:

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

Также см Франк другой, [очень информативный, ответ на асинхронном обратных вызовов] (http://stackoverflow.com/questions/27049342/asynchronous-access-to- ан-массив-в-firebase/27050749 # 27050749). – Kato

+0

Спасибо, это сработало! – VladimirSD

 Смежные вопросы

  • Нет связанных вопросов^_^