Google Cloud Endpoint runs asynchronous code at endpoints

I am trying to authenticate a client token created by the Firebase authentication library in Android at the GCE endpoint.

A guide on how to do this can be found here.

Basically, I need to call this piece of code from the endpoint (i.e. server code, not Android code).

FirebaseAuth.getInstance().verifyIdToken(idToken)
    .addOnSuccessListener(new OnSuccessListener<FirebaseToken>() {
        @Override
        public void onSuccess(FirebaseToken decodedToken) {
            String uid = decodedToken.getUid();
            // ...
        }
});

Let's say I want to execute this code and return the user to the Android client code. How should I do it?

This is my sample code that doesn't make sense. But he demonstrates what I want to do!

@ApiMethod(name = "serverAuth")
public MyUser serverAuth(@Named("token") String token) {
    FirebaseAuth.getInstance().verifyIdToken(token)
            .addOnSuccessListener(new OnSuccessListener<FirebaseToken>() {
                @Override
                public void onSuccess(FirebaseToken decodedToken) {
                    String uid = decodedToken.getUid();
                    String email = decodedToken.getEmail();
                    String name = decodedToken.getName();
                    Map<String, Object> claims = decodedToken.getClaims();

                    String claimString = "";

                    for (Object claim : claims.values()) {
                        claimString += claims.toString();
                    }

                    MyUser user = new MyUser(uid, email, name, claimString);
                    //How to return this user?

                }
            });

    //This is compile error since user varriable does not exist here    
    return user;

}

Google, GCE. . , , - - , , . , , , ?

+4
1

CountDownLatch - , . , OnSuccessListener.

: ( , MyUser, .)

@ApiMethod(name = "serverAuth")
public MyUser serverAuth(@Named("token") String token) {
    final List<MyUser> users = new ArrayList<>();
    final CountDownLatch cdl = new CountDownLatch(1);
    FirebaseAuth.getInstance().verifyIdToken(token)
            .addOnSuccessListener(new OnSuccessListener<FirebaseToken>() {
                @Override
                public void onSuccess(FirebaseToken decodedToken) {
                    // ... init uid, email, name and claimString
                    users.add(new MyUser(uid, email, name, claimString));
                    cdl.countDown();
                }
            });
    try {
        cdl.await(); // This line blocks execution till count down latch is 0
    } catch (InterruptedException ie) {

    }
    if (users.size() > 0) {
        return users.get(0);
    } else {
        return null ;
    }
}

, . , 2 :

  • :

    FirebaseAuth.getInstance().verifyIdToken(token)
    .addOnSuccessListener(new OnSuccessListener<FirebaseToken>() {
        @Override
        public void onSuccess(FirebaseToken decodedToken) {
            cdl.countDown();
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            // log error, ...
            cdl.countDown();
        }
    });
    
  • , . . , - wait():

    try {
         // This line blocks execution till count down latch is 0
         // or after 30 seconds.
        cdl.await(30l, TimeUnit.SECONDS);
    } catch (InterruptedException ie) {
    
    }
    

. , .

+4

Source: https://habr.com/ru/post/1661526/


All Articles