2

Я кодирую приложение, которое использует аутентификацию Firebase для аутентификации с моим серверным сервером.Android GoogleSignIn: несколько учетных записей в то же время + отложенная регистрация при ошибке

Я предлагаю аутентификацию Google и аутентификацию по электронной почте/паролю. Электронная почта/пароль тривиальны.

Это мой поток для использования Google Sign-In:

1) я создаю mGoogleApiClient= new GoogleApiClient с .addApi(Auth.GOOGLE_SIGN_IN_API, gso), где gso= GoogleSignInOptions с .requestIdToken(...)) и .requestEmail()

2) Я называю startActivityForResult(signInIntent, RC_GOOGLE_SIGN_IN);, где signInIntent= Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient)

3) В onActivityResult я получаю result= Auth.GoogleSignInApi.getSignInResultFromIntent(data); и оттуда GoogleSignInAccountaccount=result.getSignInAccount(), с которой я, наконец, войти в Firebase по телефону mFirebaseAuth.signInWithCredential(GoogleAuthProvider.getCredential(account.getIdToken(), null))

4) Затем я «сгенерирую»/загружаю JBT Firebase через fbUser.getToken(false), который затем отправляю на сервер базы данных для создания/проверки подлинности пользователя.

4 этажа работает. Я могу подписать приложение в Firebase и на мой серверный сервер.

Это нормально, если я хочу использовать только одну учетную запись за раз. На самом деле, это то, что я хочу сделать, но моя проблема заключается в следующем:

Я хочу, как Gmail или Входящие делает, предлагает список счетов, которые были подписаны, по крайней мере, один раз через 4 шаги, упомянутые выше.

Когда пользователь нажимает на учетную запись, я хочу сделать что-то, что немного отличается от этих 4 шагов. Я хочу сделать что-то вроде молчаливого знака, так как мы уже знаем, в какую учетную запись следует войти. Я не хочу, чтобы появился диалог выбора учетной записи входа в Google, где я должен снова выбрать этот адрес. В худшем случае пользователь сначала вводит счет [email protected] с намерением войти в [email protected], но в Chooser он выбирает [email protected], что было бы немного сложно и раздражает.

Одним из «решений» для этого является не предоставление списка известных учетных записей, а просто «вход с помощью Google», который позволяет службам Google Play предлагать диалог выбора. Но это вызывает две проблемы: 1) Нет смысла показывать список учетных записей, которые известны приложению, таком как Gmail или Входящие, потому что любой щелчок на любой учетной записи будет запрашиваться во второй раз. 2) Когда я отключен от Интернета и инициирует вход, SignInIntent завершится с ошибкой, оставив приложение в состоянии нечетного полуподписанного состояния, где отображаются данные из Account1, но Account1 фактически не подписан (или Account2 отображается, но на самом деле не подписан), а при повторном подключении к Интернету необходимо снова отобразить диалог выбора учетных записей, где пользователь должен выбрать учетную запись, которую он уже использует. Это ужасно.

В настоящее время мое решение не позволяет пользователю войти в состояние входа в систему, если Google Sign-In + Firebase не сможет правильно войти в систему, что означает, что я не буду загружать данные из локальной базы данных для этого пользователь, и пользователь не может использовать свои данные, пока он снова не получит доступ к Интернету. Это очень плохо.

Я бы хотел, чтобы пользователь мог переключить учетную запись, и если вход в систему Google не удался, затем войдите в аккаунт Android/Google, и я покажу пользователю данные для этой учетной записи и как только так как подключение к Интернету снова появляется, я хотел бы тихо войти в систему Firebase и моей бэкэнд, не показывая диалог выбора учетных записей.

Вопрос 1: Возможно ли это заархивировано Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient)? Если да, то как? Потому что я всегда получаю GoogleSignInStatusCodes.SIGN_IN_REQUIRED, который заставляет меня пройти традиционные 4 шага сверху и показать диалог выбора учетных записей. Отложив примечание, после того, как я успешно вхожу в Google, я выхожу из этой учетной записи Google после входа в учетную запись Firebase, так как мне больше не нужна эта учетная запись Google. Кроме того, перед любой попыткой входа я вызываю Auth.GoogleSignInApi.signOut(mGoogleApiClient);. Если это причина для GoogleSignInStatusCodes.SIGN_IN_REQUIRED, как я могу сохранить такую ​​информацию об учетной записи, или библиотека позаботится об этом?

Кроме того, я не вижу способа передать адрес электронной почты Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient), поэтому я не могу использовать этот метод для переключения с одной учетной записи на другую, так как мне нужно будет вывести одну учетную запись, прежде чем запрашивать вход второго. Это заставляет меня думать, что я не могу использовать этот метод, чтобы предлагать список уже известных учетных записей, например, в навигационном ящике, поскольку для переключения потребуется, чтобы Dialog снова отображался, что беспорядочно с рабочим процессом.

Итак, Вопрос 2: Как я могу войти в учетную запись, которая уже была подписана один раз молчанием, только используя электронную почту или user_id?

В качестве дополнительного, я хотел бы, чтобы отфильтровать из Chooser Диалог счета на счета, которые уже подписаны в один раз, потому что те, то получили бы подписал с помощью метода, упомянутого во втором вопросе (передать по электронной почте или user_id to silentSignIn)

Спасибо, что нашли время, чтобы прочитать это.

ответ

1

Это возможно.

Ключом к решению проблемы является передача адреса электронной почты строителю GoogleSignInOptions через gsob.setAccountName(...);, когда должен произойти «молчащий» вход (без диалога выбора учетной записи).

GoogleSignInOptions.Builder gsob = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN); 
gsob.requestIdToken(ApplicationCore.getMainActivity().getString(R.string.default_web_client_id)); 
gsob.requestEmail(); 
if (strEmail != null && !strEmail.equals("")) { 
    gsob.setAccountName(strEmail); // <------------------- here... 
} 

mGoogleApiClient = new GoogleApiClient.Builder(ApplicationCore.getMainActivity()) 
     .enableAutoManage(ApplicationCore.getMainActivity(), new GoogleApiClient.OnConnectionFailedListener() { 
      @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
       // Do some cleanup here 
      } 
     }) 
     .addApi(Auth.GOOGLE_SIGN_IN_API, gsob.build()) 
     .build(); 
}; 

mGoogleApiClient.connect(); 

Это приводит к следующему потоку, который я хотел.

enter image description here