Я внедрил Google Sign-In SDK в свое приложение, и он работает нормально. Когда я нажимаю кнопку входа, открывается окно с уже сохраненными учетными записями. Выбор одной из этих учетных записей успешно завершает процесс входа.
Единственный вариант использования, который не проходит, - это когда пользователь попадает в диалоговое окно входа и нажимает на учетную запись с неверным паролем. Я не уверен, как решить эту проблему.
Я последовал инструкции Google "реализовать SDK для входа" и после вызова этих строк:
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
GoogleSignInAccount googleSignInAccount = task.getResult(ApiException.class);
Я ловлю исключение с кодом состояния 12501 SIGN_IN_CANCELLED
.
Как я уже говорил, это происходит из-за того, что одна из хранимых учетных записей имеет неверный пароль. Вот шаги для воспроизведения:
- пользователь вошел в систему один раз
- диалог сохранил свои полномочия
- Тем временем пользователь изменил пароль своей учетной записи на www
- пользователь выбирает сохраненные учетные данные 5. происходит несвязанный код ошибки).
Как я могу заставить пользователя перенаправить на эту синюю страницу входа в Google и сохранить текущий поток?
Например, AliExpress каким-то образом справится с этим и перенаправит пользователя на синюю страницу с просьбой снова войти в систему.
Мой код мало чем отличается от инструкции Google. Это мой поток кода. Все начинается с onClick()
:
В методе onClick()
:
// Logout before all operations
GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
if (account != null) {
mGoogleSignInClient.signOut();
}
// Call to sign in
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, RequestCodes.RC_GOOGLE_SIGN_IN);
В разделе onActivityResult
:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "onActivityResult() called with: requestCode = [" + requestCode + "], resultCode = [" + resultCode + "], data = [" + data + "]");
if (requestCode == RequestCodes.RC_GOOGLE_SIGN_IN) {
try {
// Call to take account data
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
// Fetch account data
GoogleSignInAccount googleSignInAccount = task.getResult(ApiException.class);
Account account = googleSignInAccount.getAccount();
// Calling to get short lived token
String shortLivedToken = GoogleAuthUtil.getToken(mContext, account, "oauth2:" + Scopes.PROFILE + " " + Scopes.EMAIL);
// Further calls here...
} catch (ApiException e) {
//https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInStatusCodes
if (e.getStatusCode() == 12501) {
Log.e(TAG, "SIGN_IN_CANCELLED");
} else if (e.getStatusCode() == 12502) {
Log.e(TAG, "SIGN_IN_CURRENTLY_IN_PROGRESS");
} else if (e.getStatusCode() == 12500) {
Log.e(TAG, "SIGN_IN_FAILED");
} else {
e.printStackTrace();
}
} catch (GoogleAuthException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}