3

I'm trying to write a simple test of the Firebase user creation and authentication routines so that I can test my Firebase security settings. The code runs smoothly but the callbacks are not invoked and no users are created on the Firebase side.

The output of below with the print statements is:

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

Process finished with exit code 0

The code is using the firebase-client-android-2.2.3.jar file for the Firebase classes though I'm just running my test as a java application on a Mac OS. Later this will go into an Android app but I'd like to be able to run it inside my IDE for now. Any insights from experienced Firebase coders much appreciated.

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 = "me@email.com";
        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();
        }

    }

}
Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807
mba12
  • 2,702
  • 6
  • 37
  • 56
  • 2
    You might want to add a `Thread.sleep` at the end of the program. Likely your program exits before Firebase gets a chance to send anything to the server. A more proper solution would be to introduce actual lifecycle management into your app, e.g. waiting for the `createUser` call to finish. But given that you'll be migrating this to Android (which handles app lifecycle completely different anyway) that might not be worth the effort. – Frank van Puffelen Apr 30 '15 at 18:38
  • Thanks, that got me almost there. A "peer not authenticated" callback error is what I get back. I may need to actually be running in an Android app with application context for this to work. – mba12 Apr 30 '15 at 18:55
  • Update: that got me all the way there. Trying a second and third time was able to successfully create a user. Something quirky happened first attempt. Thanks Frank! – mba12 Apr 30 '15 at 19:17
  • Thanks for confirming. I added it as an answer, because you're not the first one to fall into this trap. It's completely logical, once you realize what happens. But somehow it wasn't very natural to me either a few weeks ago. – Frank van Puffelen Apr 30 '15 at 20:33
  • There's an alternative solution here: http://stackoverflow.com/questions/26092632/java-firebase-delay-exit-until-writes-finish/26112036#26112036 – mba12 Apr 30 '15 at 22:09
  • 1
    Yup, that would work to. It's what I referred to as "lifecycle management". :-) – Frank van Puffelen Apr 30 '15 at 23:04

1 Answers1

3

You'll want to add a Thread.sleep at the end of the program. Likely your program exits before Firebase gets a chance to send anything to the server.

A more proper solution would be to introduce actual lifecycle management into your app, e.g. waiting for the createUser call to finish. But given that you'll be migrating this to Android (which handles app lifecycle completely different anyway) that might not be worth the effort.

Kato
  • 40,352
  • 6
  • 119
  • 149
Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807