在Firebase SDK for Java中,createUser()不返回uid

时间:2015-03-06 14:55:07

标签: firebase firebase-realtime-database firebase-authentication

我正在尝试找出一种干净而简单的方法来获取在使用Java SDK时调用uid所产生的createUser()。使用Javascript SDK(例如this question/answer)时很容易做到这一点。我还在context of the Firebase iOS API中看到了Stackoverflow上提出的问题,显然这并不容易。我的问题是如何使用Firebase Java SDK。具体来说,我的用例与iOS相关问题中的用例相同,即允许管理员用户创建用户帐户(电子邮件/密码身份验证),并以uid为密钥在Firebase中存储有关创建用户的其他信息。了解并使用uid作为密钥至关重要,因为它是安全规则的基础。

我已经看到了几个建议的解决方案,这两个解决方案都涉及在创建新用户帐户后执行的一些过程。这些是

无论哪种方式,我都有一个带有多个异步回调的复杂解决方案来处理使用Javascript API时微不足道的问题。

因此,我有三个具体问题:

  1. 目前是否有比我上面列出的更好的方法?
  2. 如果我使用第二种方法并以新创建的用户身份登录,那么是否覆盖管理员令牌(即,注销创建用户的管理员),这又意味着新的安全规则适用?< / LI>
  3. 有没有期待Android&amp; Java SDK将很快升级,以便createUser() API与Jav​​ascript版本相同?
  4. 更新:深入挖掘并尝试一下,我找到了问题的答案。事实证明,Firebase提供的API文档已过时和/或不一致。

    Re Q1:根据Javadoc for createUser(),唯一可用的回调处理程序是Firebase.ResultHandler。但是,根据ChangelogAPI Reference documentCreating User Accounts上的文档,也可以使用Firebase.ValueResultHandler。这提供了对UID的直接访问

    Re Q2:答案是肯定的。验证新创建的用户帐户会导致替换auth令牌。

    问题3:真正的问题应该是“什么时候Firebase人员会更新Javadoc?”或者更好的问题是“为什么在没有更新和准确的文档的情况下发布SDK的新版本?”

2 个答案:

答案 0 :(得分:3)

以下代码是处理创建新用户的正确方法

Firebase ref = new Firebase("https://<YOUR-FIREBASE>.firebaseio.com");
    ref.createUser("harry@foo.com", "badPassword", new Firebase.ValueResultHandler<Map<String, Object>>() {

    public void onSuccess(Map<String, Object> result) {
        System.out.println("New account with uid: " + result.get("uid"));
    }

    public void onError(FirebaseError firebaseError) {
        // there was an error
    }
});

我已经更新了问题以解释原因。

答案 1 :(得分:0)

试试这个。这适用于最新版Google I / O中出现的较新版本的Firebase。我没有宣传这个新版本或者放弃旧版本。我只是说这是上述解决方案的替代方案:

mAuth = FirebaseAuth.getInstance();

//creates the user with email and password...make this another type of login if you want
mAuth.createUserWithEmailAndPassword(mEmail, mPassword).addOnCompleteListener(signup.this, new OnCompleteListener<AuthResult>() {
    @Override
    public void onComplete(@NonNull Task<AuthResult> task) {
        if (task.isSuccessful()) {
            //do something
        }
    }
});

现在您可以添加AuthStateListener。您必须将代码放在onCreate,onStart和onStop方法中。请注意,上述代码可以采用任何合理的方法(例如onCreate,onStart,onResume等)。我们走了:

FirebaseAuth mAuth;
FirebaseAuth.AuthStateListener mAuthListener;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_something);

    mAuth = FirebaseAuth.getInstance();
    mAuthListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = firebaseAuth.getCurrentUser();
            if(user != null){
                //check for null to prevent NullPointerException when dealing with user
                if(!user.getUid().matches("")){
                    //make this check just in case...I've experienced unexplainable glitches here
                    String uid = user.getUid();
                    //do more stuff with Uid
                }
            }
        }
    }
}

@Override
public void onStart(){
    super.onStart();
    mAuth.addAuthStateListener(mAuthListener);
}

@Override
public void onStop(){
    super.onStop();
    if(mListener != null){
        mAuth.removeAuthStateListener(mAuthListener);
    }
}

最后,发生的事情是,一旦用户被创建(并同时登录),mAuthListener就会进行回调(它会执行mAuthListener中的任何内容,在这种情况下,它会获取用户的内容) UID并用它做其他事情)。如果您在Android中需要有关此新Firebase的帮助,可以使用以下链接来帮助您:https://firebase.google.com/docs/android/setup