0

我试图找出一种干净简单的方法来获取使用 Java SDK 时uid调用的结果。createUser()这在使用 Javascript SDK 时很容易做到(例如,这个问题/答案)。我还在Firebase iOS API 的上下文中看到了 Stackoverflow 上提出的问题,这显然不是那么容易。我的问题是如何使用 Firebase Java SDK 来做到这一点。具体来说,我的用例与 iOS 相关问题中的用例相同,即允许管理员用户创建用户帐户(电子邮件/密码身份验证),并以 uid 作为密钥将有关创建用户的其他信息存储在 Firebase 中。了解和使用 uid 作为密钥是必不可少的,因为它是安全规则的基础。

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

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

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

  1. 目前有比我上面列出的两种更好的方法吗?
  2. 如果我使用第二种方法并以新创建的用户身份登录,那是否会覆盖管理员令牌(即注销创建用户的管理员),这反过来意味着新的安全规则适用?
  3. 是否有任何期望 Android 和 Java SDK 将很快升级,以便createUser()API 与 Javascript 版本相同?

更新:深入挖掘并进行一些实验,我找到了问题的答案。事实证明,Firebase 提供的 API 文档已过时和/或不一致。

关于Q1:根据createUser() 的 Javadoc,唯一可用的回调处理程序是 Firebase.ResultHandler. 但是根据变更日志API 参考文档和有关创建用户帐户的文档,Firebase.ValueResultHandler也可以使用 a。这提供了对 UID 的直接访问

关于 Q2:答案是肯定的。对新创建的用户帐户进行身份验证会导致替换auth令牌。

关于 Q3:真正的问题应该是“Firebase 人员何时会更新 Javadoc?” 或者更好的问题是“为什么发布新版本的 SDK 时没有更新和准确的文档?”

4

2 回答 2

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

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

于 2015-03-07T15:08:07.733 回答
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

于 2016-07-01T07:25:19.363 回答