简体   繁体   中英

Getting 'Error authenticating with Google: unknown' exception when trying to signin with google after installing app from play store. See details

I have integrated Google signin in my app.

When I'm testing the app on my device by directly installing it from android studio, Google signin is working fine.

But, after publishing a beta version of my app and then installing it from play store, when I'm trying to signin with Google, I'm getting the following error: ' Error authenticating with Google: unknown '.

Here's my code:

    // in onCreate()

    googleLoginButton = (SignInButton) findViewById(R.id.google_login_button);
            googleLoginButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                        mGoogleLoginClicked = true;
                        if (!mGoogleApiClient.isConnecting()) {
                            if (mGoogleConnectionResult != null) {
                                resolveSignInError();
                            } else if (mGoogleApiClient.isConnected()) {
                                getGoogleOAuthTokenAndLogin();
                            } else {
                        /* connect API now */
                                Log.d(TAG, "Trying to connect to Google API");
                                mGoogleApiClient.connect();
                            }
                        }

                }
            });
            /* Setup the Google API object to allow Google+ logins */
            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .addApi(Plus.API)
                    .addScope(Plus.SCOPE_PLUS_LOGIN)
                    .addScope(Plus.SCOPE_PLUS_PROFILE)
                    .addScope(new Scope("https://www.googleapis.com/auth/userinfo.email"))
                    .build();


    // in onActivityResult()

    @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            Map<String, String> options = new HashMap<String, String>();
            if (requestCode == RC_GOOGLE_LOGIN) {
                /* This was a request by the Google API */
                if (resultCode != RESULT_OK) {
                    mGoogleLoginClicked = false;
                }
                mGoogleIntentInProgress = false;
                if (!mGoogleApiClient.isConnecting()) {
                    mGoogleApiClient.connect();
                }
            } else {
                /* Otherwise, it's probably the request by the Facebook login button, keep track of the session */
                mFacebookCallbackManager.onActivityResult(requestCode, resultCode, data);
            }
        }



    // rest of the code:

    private void resolveSignInError() {
            if (mGoogleConnectionResult.hasResolution()) {
                try {
                    mGoogleIntentInProgress = true;
                    mGoogleConnectionResult.startResolutionForResult(this, RC_GOOGLE_LOGIN);
                } catch (IntentSender.SendIntentException e) {
                    // The intent was canceled before it was sent.  Return to the default
                    // state and attempt to connect to get an updated ConnectionResult.
                    mGoogleIntentInProgress = false;
                    mGoogleApiClient.connect();
                }
            }
        }

        private void getGoogleOAuthTokenAndLogin() {
            /* Get OAuth token in Background */
            AsyncTask<Void, Void, String> task = new AsyncTask<Void, Void, String>() {
                String errorMessage = null;

                @Override
                protected String doInBackground(Void... params) {
                    String token = null;

                    try {
                        String scope = "oauth2:https://www.googleapis.com/auth/plus.login";
  // logcat showing error on this line -> token = GoogleAuthUtil.getToken(SignupScreenActivity.this, Plus.AccountApi.getAccountName(mGoogleApiClient), scope);
                    } catch (IOException transientEx) {
                        /* Network or server error */
                        Log.e(TAG, "Error authenticating with Google: " + transientEx);
                        errorMessage = "Network error: " + transientEx.getMessage();
                    } catch (UserRecoverableAuthException e) {
                        Log.w(TAG, "Recoverable Google OAuth error: " + e.toString());
                        /* We probably need to ask for permissions, so start the intent if there is none pending */
                        if (!mGoogleIntentInProgress) {
                            mGoogleIntentInProgress = true;
                            Intent recover = e.getIntent();
                            startActivityForResult(recover, RC_GOOGLE_LOGIN);
                        }
                    } catch (GoogleAuthException authEx) {
                        /* The call is not ever expected to succeed assuming you have already verified that
                         * Google Play services is installed. */
                        Log.e(TAG, "Error authenticating with Google: " + authEx.getMessage(), authEx);
                        errorMessage = "Error authenticating with Google: " + authEx.getMessage();
                    }
                    return token;
                }

                @Override
                protected void onPostExecute(String token) {
                    mGoogleLoginClicked = false;
                    if (token != null) {
                        progressDialog = ProgressDialog.show(SignupScreenActivity.this, "",
                                "Logging in with google...", true);
                        progressDialog.show();
                        /* Successfully got OAuth token, now login with Google */
                        ref.authWithOAuthToken("google", token, new Firebase.AuthResultHandler() {
                            @Override
                            public void onAuthenticated(AuthData authData) {
                                Intent mainActivityIntent = new Intent(SignupScreenActivity.this, MainActivity.class);
                                mainActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                mainActivityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
                                startActivity(mainActivityIntent);
                                progressDialog.hide();
                            }

                            @Override
                            public void onAuthenticationError(FirebaseError firebaseError) {
                                Toast.makeText(getBaseContext(), firebaseError.getMessage(), Toast.LENGTH_LONG).show();
                                progressDialog.hide();
                            }
                        });
                    } else if (errorMessage != null) {
                        Toast.makeText(getBaseContext(), errorMessage, Toast.LENGTH_LONG).show();
                    }
                }
            };
            task.execute();
        }

        @Override
        public void onConnected(final Bundle bundle) {
            /* Connected with Google API, use this to authenticate with Firebase */
            getGoogleOAuthTokenAndLogin();
        }


        @Override
        public void onConnectionFailed(ConnectionResult result) {
            if (!mGoogleIntentInProgress) {
                /* Store the ConnectionResult so that we can use it later when the user clicks on the Google+ login button */
                mGoogleConnectionResult = result;

                if (mGoogleLoginClicked) {
                    /* The user has already clicked login so we attempt to resolve all errors until the user is signed in,
                     * or they cancel. */
                    resolveSignInError();
                } else {
                    Log.e(TAG, result.toString());
                }
            }
        }

        @Override
        public void onConnectionSuspended(int i) {
            // ignore
        }

logcat details:

Error authenticating with Google: Unknown
com.google.android.gms.auth.GoogleAuthException: Unknown
     at com.google.android.gms.auth.GoogleAuthUtil$1.zzam(Unknown Source)
     at com.google.android.gms.auth.GoogleAuthUtil$1.zzan(Unknown Source)
     at com.google.android.gms.auth.GoogleAuthUtil.zza(Unknown Source)
     at com.google.android.gms.auth.GoogleAuthUtil.zza(Unknown Source)
     at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
     at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
     at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
     at com.abc.xyz.SignupScreenActivity$10.doInBackground(SignupScreenActivity.java:480)
     at com.abc.xyz.SignupScreenActivity$10.doInBackground(SignupScreenActivity.java:471)
     at android.os.AsyncTask$2.call(AsyncTask.java:288)
     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
     at java.lang.Thread.run(Thread.java:818)

Here's build.gradle :

apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.abc.xyz"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 4
        versionName "0.3"
        multiDexEnabled true
    }

    packagingOptions {
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE-FIREBASE.txt'
        exclude 'META-INF/NOTICE'
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.2.1'
    compile 'com.android.support:design:23.2.1'
    compile 'com.android.support:cardview-v7:23.2.1'
    compile 'com.firebase:firebase-client-android:2.3.1'
    compile 'com.facebook.android:facebook-android-sdk:4.1.0'
    compile 'com.google.android.gms:play-services-maps:8.3.0'
    compile 'com.google.android.gms:play-services-plus:8.3.0'
    compile 'com.android.support:support-v4:23.2.1'
}

I don't know what's going wrong here!

Please let me know.

Make sure you have created new client id using release version of SHA1 fingerprint.

Open terminal (in Unix , in MAC ), ( cmd in Windows ) and cd to this (your java) path:

C:\Program Files\Java\jdk1.6.0_43\bin>

Run this command:

keytool -list -v -keystore "your keystore path" -alias "keystore alias name" -storepass "keystore password" -keypass "keystore password"

As far as I remember, in order to generate an access key for Google APIs, you must provide some data about your app, including the key that are using to sign your APK. As Baijrao Shinde has pointed out in his answer, you should double check that you have two distinct client ID for running your application in debug mode (installing directly from your Android Studio using the debug key to sing the APK) and production mode (installing from Google Play using the production key to sign the APK).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM