【问题标题】:In Firebase SDK for Java createUser() does not return uid在 Firebase SDK for Java 中 createUser() 不返回 uid
【发布时间】:2015-03-06 14:55:06
【问题描述】:

我试图找出一种干净简单的方法来获取在使用 Java SDK 时调用 createUser() 产生的 uid。这在使用 Javascript SDK(例如,this question/answer)时很容易做到。我还在 context of the 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:根据Javadoc for createUser(),唯一可用的回调处理程序是Firebase.ResultHandler。但是根据ChangelogAPI Reference documentCreating User Accounts 上的文档,也可以使用Firebase.ValueResultHandler。这提供了对 UID 的直接访问

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      试试这个。这是针对在最近的 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-16
        • 2015-01-02
        • 1970-01-01
        • 2015-07-10
        • 2016-10-06
        • 1970-01-01
        • 1970-01-01
        • 2018-08-19
        相关资源
        最近更新 更多