Ошибка Firebase OAuth: неверный id_token в ответе idp

Кажется, мне удалось внедрить Google OAuth, чтобы использовать его с Firebase. Проблема в том, что иногда, когда я выхожу из системы и пытаюсь снова войти, это не работает, и я получаю сообщение об ошибке:

[Invalid id_token in idp response: ...]". 

С этого момента SignIn не работает, может быть, через несколько дней. Может быть, по истечении определенного срока (я так и не узнал, почему он снова заработал). Есть идеи, как это исправить?

Вот мой код (SignInActivity):

private void initializeGoogle() {
    final SignInButton objConnectButton = (SignInButton) findViewById(R.id.signin_google);

    GoogleSignInOptions objOptions = new GoogleSignInOptions
        .Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
        .requestIdToken(C.GOOGLE_CLIENT_ID).build();

    final GoogleApiClient objGoogleApiClient = new GoogleApiClient.Builder(this)
        .enableAutoManage(this, new GoogleApiClient.OnConnectionFailedListener() {
            @Override
            public void onConnectionFailed(@NonNull ConnectionResult aobjResult) {
                C.handleEvent(SignInActivity.this, R.string.msg_signin_connection_failed, aobjResult.getErrorMessage(), 7);
            }
        }).addApi(Auth.GOOGLE_SIGN_IN_API, objOptions).build();

    objConnectButton.setOnClickListener(new View.OnClickListener() {
        @Override public void onClick(View view) {
        startActivityForResult(Auth.GoogleSignInApi.getSignInIntent(objGoogleApiClient),
            C.ReqCode.SIGNIN_GOOGLE);
        }
    });
}

private void signInWithGoogle(final GoogleSignInAccount aobjAccount, AuthCredential aobjCredential) {
    FirebaseAuth.getInstance().signInWithCredential(aobjCredential)
        .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> aobjTask) {
            if (aobjTask.isSuccessful()) {
                startMainActivityWithValues(aobjAccount.getDisplayName(), C.SignInType.GOOGLE);
            }
        }
    })
    .addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception aobjException) {
            C.handleEvent(SignInActivity.this, R.string.msg_signin_connection_failed, aobjException.getMessage(), 12);
        }
    });
}

@Override
protected void onActivityResult(int aintRequestCode, int aintResultCode, Intent aobjDataIntent) {
    super.onActivityResult(aintRequestCode, aintResultCode, aobjDataIntent);

    // Handle Google Auth
    if (aintRequestCode == C.ReqCode.SIGNIN_GOOGLE) {
        if ((aintResultCode == RESULT_OK)) {

            GoogleSignInResult objSignInResult = Auth.GoogleSignInApi.getSignInResultFromIntent(aobjDataIntent);
            if (objSignInResult.isSuccess()) {

                final GoogleSignInAccount objAccount = objSignInResult.getSignInAccount();
                String strTokenID = (objAccount != null ? objAccount.getIdToken() : null);

                if (strTokenID != null) {
                        signInWithGoogle(objAccount, GoogleAuthProvider.getCredential(strTokenID, null));
                } else {
                        C.handleEvent(SignInActivity.this, R.string.msg_signin_connection_failed, getString(R.string.msg_signin_connection_invalid_token), 10);
                }
            } else {
                C.handleEvent(SignInActivity.this, R.string.msg_signin_connection_failed, objSignInResult.getStatus().getStatusMessage(), 8);
            }
        } else {
                C.handleEvent(SignInActivity.this, R.string.msg_signin_connection_cancelled, "", 9);
        }
    }
}

private void startMainActivityWithValues(String astrUsername, int aintAuthType) {
    Intent objIntent = new Intent(SignInActivity.this, MainActivity.class);

    objIntent.putExtra("USER_NAME", astrUsername);
    objIntent.putExtra("AUTH_SOURCE", aintAuthType);

    startActivity(objIntent);
    finish();
}

private void signOutFromGoogle() {
    final GoogleApiClient objClient = new GoogleApiClient.Builder(MainActivity.this)
        .addApi(Auth.GOOGLE_SIGN_IN_API, new GoogleSignInOptions.Builder(
        GoogleSignInOptions.DEFAULT_SIGN_IN).build()).build();

    objClient.registerConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
        @Override
        public void onConnected(@Nullable Bundle aobjBundle) {
            if (objClient.isConnected()) {
                objFbAuth.signOut();
                Auth.GoogleSignInApi.signOut(objClient).setResultCallback(new ResultCallback<Status>() {
                    @Override
                    public void onResult(@NonNull Status aobjStatus) {
                        if (aobjStatus.isSuccess()) {
                            startActivity(new Intent(MainActivity.this, SignInActivity.class));
                            finish();
                            Toast.makeText(MainActivity.this, getString(R.string.msg_signin_logged_out), Toast.LENGTH_SHORT).show();
                        } else {
                            C.handleEvent(MainActivity.this, R.string.msg_signin_disconnection_failed, "", 14);
                        }
                    }
                });
            }
        }

        @Override
        public void onConnectionSuspended(int aintCause) {
            String strMessage = "ConnectionSuspended (" + (aintCause == 1 ? "SERVICE_DISCONNECTED" : "NETWORK_LOST") + ")";
            C.handleEvent(getBaseContext(), R.string.msg_signin_connection_failed, strMessage, 2);
        }
    });

    objClient.connect();
}

person Don Madrino    schedule 11.01.2017    source источник
comment
Примечание. Кажется, это происходит только на моем эмуляторе (BlueStack), проблема не возникает на устройстве. Есть идеи?   -  person Don Madrino    schedule 12.01.2017


Ответы (2)


Вот решение, которое, кажется, работает: в Android Studio откройте меню «Файл» и нажмите «Недействительно и перезапустить». Также: перезапустите Bluestacks (закройте его через значок в трее). Возможно, нужен только один из этих шагов, но я еще не пробовал.

person Don Madrino    schedule 27.01.2017

Я столкнулся с той же проблемой ночью, но на следующее утро я проверил, все работает. Просто убедитесь, что отпечаток сертификата SHA1 на экране подписи приложения (консоль Google Play) присутствует в вашей конфигурации firebase.

person Murtuza    schedule 28.01.2018