3

我正在尝试编写Firebase用户创建和身份验证例程的简单测试,以便测试我的Firebase安全设置。代码运行平稳,但不会调用回调,也不会在Firebase一侧创建用户。FIrebase Java/Android createUser失败

的下面报表的打印输出是:

Begin process 
Start Create User 
Creating User 
End Creating User 
End process 

Process finished with exit code 0 

的代码使用了火力地堡类火力点,客户端Android的2.2.3.jar文件,虽然我只是跑在我的测试作为Mac OS上的Java应用程序。后来这将进入一个Android应用程序,但我想现在可以在我的IDE中运行它。来自有经验的Firebase程序员的任何见解都非常感谢。

import com.firebase.client.Firebase; 
import com.firebase.client.AuthData; 
import com.firebase.client.FirebaseError; 

import java.util.*; 

public class FireRulesTest { 


static String firebase_baseUrl = "https://<myfirebase>.firebaseio.com/"; 

public static void main(String[] args) 
     throws FirebaseException { 

    System.out.println("Begin process"); 

    FireRulesTest tester = new FireRulesTest(); 
    tester.createUser(); 

    System.out.println("End process"); 
} 

private void createUser() 
     throws FirebaseException { 

    try { 
     System.out.println("Start Create User"); 

     final String mEmail = "[email protected]"; 
     final String mPassword = "password"; 

     final Firebase ref = new Firebase(firebase_baseUrl); 
     System.out.println("Creating User"); 

     ref.createUser(mEmail, mPassword, 
       new Firebase.ValueResultHandler<Map<String, Object>>() { 

        @Override 
        public void onSuccess(Map<String, Object> result) { 
         System.out.println("Successfully created user account with uid: " + result.get("uid")); 
         ref.authWithPassword(mEmail, mPassword, new Firebase.AuthResultHandler() { 
          @Override 
          public void onAuthenticated(AuthData authData) { 
           //success, save auth data 
           HashMap<String, Object> authMap = new HashMap<String, Object>(); 
           authMap.put("uid", authData.getUid()); 
           authMap.put("token", authData.getToken()); 
           authMap.put("email", mEmail); 
           authMap.put("password", mPassword); 

           Firebase currentUserRef = new Firebase(firebase_baseUrl + "movo/users/" + authData.getUid()); 
           authMap.put("currentUser", currentUserRef); 

           System.out.println("User ID: " + authData.getUid() + 
             ", Provider: " + authData.getProvider() + 
             ", Expires:" + authData.getExpires()); 


           System.out.println("Authentication complete"); 
          } 

          @Override 
          public void onAuthenticationError(FirebaseError firebaseError) { 
           System.out.println("Authentication Error authenticating newly created user. This could be an issue. "); 
           System.out.println(firebaseError.getMessage()); 
          } 

         }); 

         } 

         @Override 
         public void onError(FirebaseError firebaseError) { 
         System.out.println("On Error authenticating newly created user. This could be an issue. "); 
          System.out.println(firebaseError.getMessage()); 
         } 
      }); 

      System.out.println("End Creating User"); 

     } catch (Exception fbe) { 
      System.out.println("Exception: " + fbe.getMessage()); 
      fbe.printStackTrace(); 
     } 

    } 

} 
+2

您可能想在程序结尾添加一个'Thread.sleep'。在Firebase有机会向服务器发送任何内容之前,您的程序可能会退出。更合适的解决方案是将实际的生命周期管理引入您的应用程序,例如等待'createUser'调用完成。但是鉴于您将会将其迁移到Android(处理完全不同的应用程序生命周期),这可能不值得您付出努力。 –

+0

谢谢,这让我几乎在那里。 “同行未经认证”的回调错误是我回来的。我可能需要真正在具有应用程序上下文的Android应用程序中运行才能正常工作。 – mba12

+0

更新:那让我一直在那里。尝试第二次和第三次能够成功创建一个用户。第一次尝试发生了一些古怪的事情。谢谢弗兰克! – mba12

回答

3

您需要在程序结尾添加Thread.sleep。在Firebase有机会向服务器发送任何内容之前,您的程序可能会退出。

更合适的解决方案是将实际生命周期管理引入您的应用程序,例如,等待createUser通话完成。但是鉴于您将会将其迁移到Android(处理完全不同的应用程序生命周期),这可能不值得您付出努力。