Кажется, мне удалось внедрить 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();
}