在管理屏幕中,我同时启用了电子邮件身份验证和匿名登录。 数据只有一个节点 - Hello:“World”
我的规则是
{
"rules": {
".read": "auth != null",
//".read": true,
".write": true
}
}
如果用户未使用上述规则登录,则可以获得 读取失败:权限被拒绝 这一切都很好。
如果有匿名用户登录,那么我可以看到值“{Hello = World”} 到目前为止工作。
如果我使用电子邮件用户登录,则会收到错误消息:FirebaseError:Permission denied
onAuthenticate会触发,我得到: 用户名: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("myuser@home.com", "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());
}
});
}
}
答案 0 :(得分:3)
我很确定您只是看到电子邮件+密码身份验证异步发生这一事实的影响。
按顺序:
logonEmail();
showValues();
在showValues()
执行时,身份验证尚未完成。
异步排序的解决方案很简单,但最初非常不直观:您需要确保{/ 1}仅在认证成功后执行。
一种简单的方法:
showValues()