Я хочу использовать базу данных 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?
Большое спасибо заранее.