Skip to content

ClientInterceptor and Firebase IdToken #5428

Open
@developerGM

Description

@developerGM

Hi, I am usign GRPC service and I am trying to extends ClientInterceptor to append some headers and ask to Firebase to give me a IdToken but I don't understand how can do it because task.getResult() go to in exception java.lang.IllegalStateException: Task is not yet complete

I have tried also with a sync mode
GetTokenResult tokenResult = Tasks.await(task, 20, TimeUnit.SECONDS);
but nothing, exception java.lang.IllegalStateException: Must not be called on the main application thread

public class CustomHeaderInterceptor implements ClientInterceptor {
    @Override
    public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(MethodDescriptor<ReqT, RespT> method, CallOptions callOptions, Channel next) {
        return new ForwardingClientCall.SimpleForwardingClientCall<ReqT, RespT>(next.newCall(method, callOptions)) {
            @Override
            public void start(Listener<RespT> responseListener, Metadata headers) {
                headers.put(Metadata.Key.of("X-XXX", Metadata.ASCII_STRING_MARSHALLER), "test_test");

                try {
                    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                    if (user == null) {
                        throw new Exception("User is not logged in.");
                    } else {
                        Task<GetTokenResult> task = user.getIdToken(false);
                        GetTokenResult tokenResult = task.getResult();

                        String idToken = tokenResult.getToken();
                        headers.put(Metadata.Key.of("Authorization", Metadata.ASCII_STRING_MARSHALLER), "Bearer " + idToken);

                        super.start(responseListener, headers);
                    }
                } catch (Exception e) {
                    Log.d(this.getClass().getName(), new Gson().toJson(e));
                }
            }
        };
    }
}

I have tried also CompletableFuture

                        Task<GetTokenResult> task = user.getIdToken(false);
                        CompletableFuture<String> completableFuture = new CompletableFuture<>();
                        task.addOnCompleteListener(new OnCompleteListener<>() {
                           @Override
                            public void onComplete(Task<GetTokenResult> task1) {
                                GetTokenResult tokenResult = task1.getResult();
                                String idToken = tokenResult.getToken();
                                completableFuture.complete(idToken);
                           }
                        });
                        String idToken = completableFuture.get();

but the code stop on completableFuture.get()

How can I do to ask and append on each call the firebase token?

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions