Search code examples
androidfirebasefirebase-authenticationgoogle-cloud-endpoints

Android: Firebase auth for Cloud End Point not working


I have followed the link and have done the configuration on the server as mentioned.

"/users":
post:
  description: "<Description>"
  operationId: "<OperationID>"
  produces:
  - "application/json"
  responses:
    200:
      description: "user List"
      schema:
        $ref: "#/definitions/echoMessage"
  parameters:
  - description: "Search Criteria"
    in: body
    name: message
    required: true
    schema:
      $ref: "#/definitions/echoMessage"
  security:
    - firebase: []

and

  firebase:
authorizationUrl: ""
flow: "implicit"
type: "oauth2"
x-google-issuer: "https://securetoken.google.com/<Project-ID>"
x-google-jwks_uri: "https://www.googleapis.com/service_accounts/v1/metadata/x509/securetoken@system.gserviceaccount.com"

And after going through JWT standards I came to know that while calling calling the service we have to add Authorization header with Bearer so I have added the header as follows,

Authorization: Bearer

I initially tried with

String token = FirebaseInstanceId.getInstance().getToken();

But it gave error so I tried with,

FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
    if (firebaseUser != null) {

        firebaseUser.getIdToken(true)
                .addOnSuccessListener(new OnSuccessListener<GetTokenResult>() {
                    @Override
                    public void onSuccess(GetTokenResult getTokenResult) {
                        String token = getTokenResult.getToken();
                        SharedPreferences.Editor editor = mSharedPreferences.edit();
                        editor.putString(Constants.PREFS_FCM_TOKEN, token);
                        editor.apply();
                    }
                });
    }

But even with both codes I am getting error as 401 and invalid_token


Solution

  • After so many days of struggle I am able to solve the issue.

    I solved the issue by following this,

        "/users":
    post:
      description: "<Description>"
      operationId: "<OperationID>"
      produces:
      - "application/json"
      responses:
        200:
          description: "user List"
          schema:
            $ref: "#/definitions/echoMessage"
      parameters:
      - description: "Search Criteria"
        in: body
        name: message
        required: true
        schema:
          $ref: "#/definitions/echoMessage"
      security:
        - firebase: []
    

    and

    firebase:
    authorizationUrl: ""
    flow: "implicit"
    type: "oauth2"
    x-google-issuer: "https://securetoken.google.com/<Project-ID>"
    x-google-jwks_uri: "https://www.googleapis.com/service_accounts/v1/metadata/x509/securetoken@system.gserviceaccount.com"
    x-google-audiences: "<Project-ID>" //I have added this, this was the main culprit.
    

    as mentioned in the comment, I was missing

    x-google-audiences: ""

    in the server configuration.

    And for another clarification for which token to use: We have to use the second approach that I have mentioned in the question, i.e, as below,

    FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
        if (firebaseUser != null) { 
    
            firebaseUser.getIdToken(true)
                    .addOnSuccessListener(new OnSuccessListener<GetTokenResult>() { 
                        @Override 
                        public void onSuccess(GetTokenResult getTokenResult) {
                            String token = getTokenResult.getToken();
                            SharedPreferences.Editor editor = mSharedPreferences.edit();
                            editor.putString(Constants.PREFS_FCM_TOKEN, token);
                            editor.apply();
                        } 
                    }); 
        }