coolamz
coolamz

Reputation: 397

Firebase Authentication Not working in signed APK

I'm using Firebase Google Sign in. It works perfectly via USB debugging. But when I generate signed APK, it stops working. Its not able to sign in. Using it on Android 5.1 & Android 6.0.1. Also, if the Google play services is not updated, it gives user prompt to update it because of which user may leave the app. How can I turn off the prompt and solve the error?

public class MainActivity extends AppCompatActivity implements  GoogleApiClient.OnConnectionFailedListener,
        View.OnClickListener {
private Button skip;
    private static final String TAG = "GoogleActivity";
    private static final int RC_SIGN_IN = 9001;
    private ProgressBar pb;
    // [START declare_auth]
    private FirebaseAuth mAuth;
    // [END declare_auth]

    // [START declare_auth_listener]
    private FirebaseAuth.AuthStateListener mAuthListener;
    // [END declare_auth_listener]

    private GoogleApiClient mGoogleApiClient;
    private TextView mStatusTextView;
    private TextView mDetailTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        pb=(ProgressBar)findViewById(R.id.signpro);
        pb.setVisibility(View.GONE);
        skip=(Button)findViewById(R.id.btnskip);
        skip.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setContentView(R.layout.activity_home);
            }
        });
        // Views


        // Button listeners
        findViewById(R.id.sign_in_button).setOnClickListener(this);

        // [START config_signin]
        // Configure Google Sign In
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(getString(R.string.default_web_client_id))
                .requestEmail()
                .build();
        // [END config_signin]

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
                .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                .build();

        // [START initialize_auth]
        mAuth = FirebaseAuth.getInstance();
        // [END initialize_auth]

        // [START auth_state_listener]
        mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {

                FirebaseUser user = firebaseAuth.getCurrentUser();
                if (user != null) {
                    // User is signed in
                    Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
                    setContentView(R.layout.activity_home);

                } else {
                    // User is signed out
                    Log.d(TAG, "onAuthStateChanged:signed_out");
                }
                // [START_EXCLUDE]

                // [END_EXCLUDE]
            }
        };
        // [END auth_state_listener]
    }

    // [START on_start_add_listener]
    @Override
    public void onStart() {
        super.onStart();
        mAuth.addAuthStateListener(mAuthListener);

    }
    // [END on_start_add_listener]

    // [START on_stop_remove_listener]
    @Override
    public void onStop() {
        super.onStop();
        if (mAuthListener != null) {
            mAuth.removeAuthStateListener(mAuthListener);
        }
    }
    // [END on_stop_remove_listener]

    // [START onactivityresult]
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
        if (requestCode == RC_SIGN_IN) {
            GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
            if (result.isSuccess()) {
                Toast.makeText(this, "Signing you in. Please Wait...", Toast.LENGTH_LONG).show();
                // Google Sign In was successful, authenticate with Firebase
                GoogleSignInAccount account = result.getSignInAccount();
                firebaseAuthWithGoogle(account);
                Toast.makeText(this, "Sign In Successful!", Toast.LENGTH_SHORT).show();
            } else {
                // Google Sign In failed, update UI appropriately
                // [START_EXCLUDE]

                Toast.makeText(this, "Google Sign In failed. Please Skip.", Toast.LENGTH_SHORT).show();
                pb.setVisibility(View.GONE);
                // [END_EXCLUDE]
            }
        }
    }
    // [END onactivityresult]

    // [START auth_with_google]
    private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
        Log.d(TAG, "firebaseAuthWithGoogle:" + acct.getId());
        // [START_EXCLUDE silent]

        // [END_EXCLUDE]

        AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        Log.d(TAG, "signInWithCredential:onComplete:" + task.isSuccessful());

                        // If sign in fails, display a message to the user. If sign in succeeds
                        // the auth state listener will be notified and logic to handle the
                        // signed in user can be handled in the listener.
                        if (!task.isSuccessful()) {
                            Log.w(TAG, "signInWithCredential", task.getException());
                            Toast.makeText(MainActivity.this, "Authentication failed.",
                                    Toast.LENGTH_SHORT).show();
                        }
                        // [START_EXCLUDE]

                        // [END_EXCLUDE]
                    }
                });
    }
    // [END auth_with_google]

    // [START signin]
    private void signIn() {
        pb.setVisibility(View.VISIBLE);
        Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
        startActivityForResult(signInIntent, RC_SIGN_IN);
    }
    // [END signin]



    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
        // An unresolvable error has occurred and Google APIs (including Sign-In) will not
        // be available.
        Log.d(TAG, "onConnectionFailed:" + connectionResult);
        Toast.makeText(this, "Google Play Services error.", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onClick(View v) {
        int i = v.getId();
        if (i == R.id.sign_in_button) {
            signIn();

        }
    }
}

Upvotes: 24

Views: 19850

Answers (9)

YOGESH KUMAR
YOGESH KUMAR

Reputation: 11

You just need to find debug SHA1 and SHA256 for authentication in debug mode

For Windows:

open terminal in your IDE and type: cd android

and then

gradlew signingReport

and copy debug SHA1 and SHA256 and paste them in firebase console

------------------for signed apk -------------------------------

Open terminal type:

keytool-list-v-keystore"{path of jks file by which you signed apk}" alias {alias of keystore used to sign apk}-storepass{password of keystore}-keypass{password of keystore}

you will get release SHA1 and SHA256 paste both these in firebase console

this will work

Upvotes: 1

boringdeveloper
boringdeveloper

Reputation: 446

The SHA-1 Certificate Fingerprint can be found under Release > Setup > App Integrity

Google Play App Signing Key Certificate

Next is to add the SHA-1 Certificate Fingerprint in your Firebase Console. Go to Project Settings > General > Add Fingerprint Firebase General Project Settings

After doing the following, I redownloaded the new google-services.json file and replaced the one in my project.

As for my case. After doing the above steps, the published app still wasn't able to connect to Firebase. What I did is to manually add the SHA-1 Certificate Fingerprint in Google Cloud Platform > API and Services > Credentials then select the Android Key (auto created by Firebase).

Google Cloud Platform API and Services Credentials

Upvotes: 1

Vinay Kumar
Vinay Kumar

Reputation: 21

for anyone new coming in, the keys are moved to

Play Store Console > your app > release > setup > app integrity

here you will find both SHA-1 and SHA-256 keys, add them in your firebase project and you're good.

Upvotes: 2

DIVYANSHU SAHU
DIVYANSHU SAHU

Reputation: 1215

Firebase Console method With some new updates

There is a really easy method directly from Firebase Console.

Step 01: Just go to Settings > Integrations in Firebase Console

enter image description here

Step 02: Then hit the link button on the Google Play card, to make the SHA-1 and SHA-256 code from your Google Play console directly added to your Firebase console.

enter image description here

Then it will be added to your Firebase console check by going to Settings > Integrations

enter image description here

Step 03: Here you have to manually add the Upload key Certificate SHA-1 from the Google Play console manually to the firebase google play console

enter image description here

Step 04: Then download the new google-services.json and replace it with the one in Android studio that you added when creating the Firebase project.

Upvotes: 4

Sushen Biswas
Sushen Biswas

Reputation: 552

For Windows:

In Reality:

keytool -list -v -keystore "E:\Google Drive\MeshstocksSyncronize\AndroidKey\BRB\bangaliRussainBusiness.jks"

for Example :

keytool -list -v -keystore "**Here is your path**"

Paste this line in your android studio terminal.

Follow the video for better understanding: https://youtu.be/TYrmT8Emadg

Upvotes: 6

Phake
Phake

Reputation: 1351

Maybe I am a bit late, but for everyone experiencing the issue and not having found a solution, here is mine:

I have hosted my app on Firebase and enabled Firebase Auth for Email and Password.

The app worked fine in debug mode, but as I signed the app and ran it am my phone, NO API worked. I found out that it was due to my api-key in google-cloud being restricted. I found out that I only used the SHA1 from my debug app, however I needed to add the SHA1 release key as well.

Generating your SHA1 key is fairly simple:

  • Follow this tutorial to genereate a key for your app: Firebase Deployment Tutorial

  • generate your SHA1 from that key using:

    keytool -list -v -keystore {keystore_name} -alias {alias_name}
    

If you get an error that the command "keystore" cannot be found, navigate to your Java Runtime Environment (jre) directory and use the command there. An example path can be found here:

C:\"Program Files"\Android\"Android Studio"\jre\bin

Upvotes: 4

Sameera Chathuranga
Sameera Chathuranga

Reputation: 341

I had the same problem and I fixed the problem using these methods.

  1. Complete app signing on your Play store console using these instructions How to enable Google Play App Signing

  2. Go to your Firebase console Settings > General > Your apps > (Select your project) then add the SHA-1 from App signing certificate from your Play store. You can get SHA-1 by going to Release management -> App signing as show in this image.

enter image description here

Upvotes: 34

Brijpath
Brijpath

Reputation: 73

Steps to locate the SHA-1 key: 1) Go to your Google Play Console 2) Select the targeting app 3) Go to "App signing" under "Release management" 4) The SHA-1 key can be found under "App Signing Certificate"

It took me many hours to resolve the issue and I hope this can help someone who runs into the same issue.

Upvotes: 6

Manoj Perumarath
Manoj Perumarath

Reputation: 10194

You are having fingerprint certificate in console, but its only for debugging purposes, for signed apk you need a production fingerprint certificate, and you can get one by

 c:\Program Files\Java\jdk1.6.25\bin>keytool -list -v -keystore c:\you_key_here.key

Upvotes: 12

Related Questions