Я кодирую приложение, которое использует аутентификацию 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);
и оттуда GoogleSignInAccount
account
=
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)
Спасибо, что нашли время, чтобы прочитать это.