Как использовать базу данных Firestore и хранилище данных в одном приложении Android - PullRequest
1 голос
/ 17 января 2020

Я хочу использовать базу данных Firestore и Datastore в одном приложении Android. Я знаю, что невозможно использовать оба в одном проекте GCP (объяснено здесь: Firestore и Datastore в одном проекте GAE ), поэтому я создал два разных проекта, один для Firestore и один для Datastore. Так что теперь проблема в том, что я не могу создать идентификатор клиента для моего Android приложения в обоих проектах из-за «дублированных отпечатков пальцев».

Если бы у меня был только один проект, я бы обычно входил в систему через Firebase AuthUi, а затем использовал токен из FirebaseUser для построения моего обработчика сервиса.

//login via FirebaseUI
FirebaseAuth auth = FirebaseAuth.getInstance();

AuthUI.getInstance().createSignInIntentBuilder()
                        .setTheme(getSelectedTheme())
                        .setLogo(getSelectedLogo())
                        .setAvailableProviders(getSelectedProviders())
                        .setTosAndPrivacyPolicyUrls(getSelectedTosUrl(),getSelectedPrivacyPolicyUrl())
                        .setIsSmartLockEnabled(true,true)
                        .build(),

FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();

Task<GetTokenResult> tokenResultTask =  firebaseUser.getIdToken(false);

tokenResultTask.addOnCompleteListener(task -> {
       String result = task.getResult().getToken();

       //Creating the service object
       GoogleCredential credential = new GoogleCredential();
       credential.setAccessToken(result);

        EndpointsApi.Builder builder  = new EndpointsApi.Builder(
                AppConstants.HTTP_TRANSPORT,
                AppConstants.JSON_FACTORY, credential);
        builder.setApplicationName("endpointsapi-server");
        return builder.build();
});

Это работает очень хорошо, если я только есть один проект. Но что делать, если есть Mutliple? Службы google. json связаны с одним проектом, который также имеет идентификатор клиента android, но второй проект не может создать идентификатор клиента android, используя тот же sha1 и имя пакета (дублированные отпечатки пальцев). Если я просто использую токен доступа из первого проекта для создания объекта службы (который принадлежит второму проекту), я просто получаю ошибку:

401 Unauthorized
    {
      "code": 401,
      "errors": [
        {
          "domain": "global",
          "message": "Authorization required",
          "reason": "required"
        }
      ],
      "message": "Authorization required"
    }

, что имеет смысл, потому что второй проект не знать о первом. Я забыл, что делать, чтобы как-то использовать оба одновременно.

В своем веб-приложении я просто добавляю белый список веб-клиента первого проекта во второй, а затем использую учетные данные первого, полученные с помощью firebase.AuthUi, чтобы войти второй. Что работает.

this.uiConfig = {
      callbacks: {
        signInSuccess: (currentUser, credential, redirectUrl) => {
          const googleAuthcredential = 
          firebase.auth.GoogleAuthProvider.credential(credential['idToken']);      
          firebase.apps[1].auth().signInAndRetrieveDataWithCredential(googleAuthcredential):

        }
      }
    };

this.ui = new firebaseui.auth.AuthUI(firebase.auth());
this.ui.start('#firebaseui-auth-container', this.uiConfig);


Как добиться того же самого в Android?

Большое спасибо заранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...