Аутентификация и подключение к базе данных

Относится только к версии Cloud Firestore Enterprise.

Требования к подключению

Для совместимости Cloud Firestore с клиентами MongoDB требуется следующее:

  • Драйверы должны подключаться в режиме load balanced . Это не позволяет драйверам пытаться определить точную топологию сервера, к которому они подключаются.
  • Драйверы должны подключаться с включенным протоколом SSL.
  • Драйверы должны отключить повторные записи. Cloud Firestore с совместимостью с MongoDB в настоящее время не поддерживает повторные записи.

Получить строку подключения

Строка подключения к базе данных зависит от UID базы данных, её расположения и механизма аутентификации. Ниже описан порядок формирования строки подключения.

Точная строка подключения зависит от механизма аутентификации, но базовая строка подключения использует следующий формат:

mongodb://UID.LOCATION.firestore.goog:443/DATABASE_ID?loadBalanced=true&tls=true&retryWrites=false

Базовую строку подключения можно получить одним из следующих способов:

Консоль Firebase
  1. В консоли Firebase перейдите на страницу базы данных Firestore .

    Перейти к базе данных Firestore

  2. Щелкните базу данных, которую вы хотите аутентифицировать.
  3. На панели проводника нажмите Просмотреть больше .
  4. Выберите Подключиться с помощью инструментов MongoDB .
  5. Скопируйте строку подключения.
gcloud

Используйте gcloud firestore database describe для получения информации об UID и местоположении:

gcloud firestore databases describe \
--database=DATABASE_ID \
--format='yaml(locationId, uid)'

Замените DATABASE_ID на идентификатор базы данных.

Вывод включает местоположение и уникальный идентификатор базы данных. Используйте эту информацию для построения базовой строки подключения.

Используйте базовую строку подключения и один из следующих методов для аутентификации и подключения к вашей базе данных:

Подключитесь с именем пользователя и паролем (SCRAM)

Выполните следующие действия, чтобы создать учетные данные пользователя для вашей базы данных и подключиться к ней.

Прежде чем начать

Чтобы получить разрешения, необходимые для создания пользователя, попросите администратора предоставить вам IAM-роль userCredsAdmin ( roles/datastore.userCredsAdmin ) в вашей базе данных. Подробнее о предоставлении ролей см. в статье Управление доступом к проектам, папкам и организациям .

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

Создайте пользователя и подключитесь к базе данных

Чтобы создать пользователя для базы данных Cloud Firestore с совместимостью с MongoDB, используйте один из следующих методов:

Консоль Google Cloud
  1. В консоли Google Cloud перейдите на страницу Базы данных .

    Перейти к базам данных

  2. Выберите базу данных из списка баз данных.
  3. В навигационном меню нажмите кнопку «Аутентификация» .
  4. Нажмите Добавить пользователя .
  5. Введите имя пользователя .
  6. Выберите роль для нового пользователя.
  7. Нажмите «Добавить» .

    Пароль нового пользователя будет отображен в диалоговом окне подтверждения.

gcloud CLI
  1. Для аутентификации в SCRAM необходимо сначала создать учётные данные пользователя. Используйте команду gcloud alpha firestore user-creds :
    gcloud alpha firestore user-creds create USERNAME --database=DATABASE_ID
    Заменить следующее:
    • USERNAME : имя пользователя, которое необходимо создать.
    • DATABASE_ID : идентификатор базы данных.

    Вывод этой команды включает пароль пользователя.

    Вывод будет выглядеть примерно так:

    name: projects/PROJECT_NAME/databases/DATABASE_ID/userCreds/USERNAME
    resourceIdentity:
      principal: principal://firestore.googleapis.com/projects/PROJECT_NUMBER/name/databases/DATABASE_ID/userCreds/USERNAME
    securePassword: PASSWORD
  2. По умолчанию у этого нового пользователя нет никаких прав. Чтобы получить доступ на чтение и запись в базу данных, добавьте роль roles/datastore.user для этой базы данных:

    gcloud projects add-iam-policy-binding PROJECT_NAME \
    --member='principal://firestore.googleapis.com/projects/PROJECT_NUMBER/name/databases/DATABASE_ID/userCreds/USERNAME' \
    --role=roles/datastore.user \
    --condition='expression=resource.name == "projects/PROJECT_NAME/databases/DATABASE_ID",title="CONDITION_TITLE"'
    Заменить следующее:

Для подключения к базе данных с помощью SCRAM используйте следующую строку подключения:

mongodb://USERNAME:PASSWORD@UID.LOCATION.firestore.goog:443/DATABASE_ID?loadBalanced=true&authMechanism=SCRAM-SHA-256&tls=true&retryWrites=false

Заменить следующее:

  • USERNAME : имя пользователя.
  • PASSWORD : пароль, который вы сгенерировали для этого пользователя.
  • UID : UID базы данных.
  • LOCATION : местоположение базы данных.
  • DATABASE_ID : идентификатор базы данных.

Подключитесь к библиотеке аутентификации Google

Следующий пример кода регистрирует обработчик обратного вызова OIDC, используя стандартную библиотеку OAuth Google Cloud .

Эта библиотека позволяет использовать ряд различных типов аутентификации (учетные данные приложения по умолчанию, объединение удостоверений рабочей нагрузки).

Для этого необходимо добавить библиотеку аутентификации в качестве зависимости :

// Maven
<dependency>
  <groupId>com.google.auth</groupId>
  <artifactId>google-auth-library-oauth2-http</artifactId>
  <version>1.19.0</version>
</dependency>

// Gradle
implementation 'com.google.auth:google-auth-library-oauth2-http:1.19.0'

Следующий пример кода демонстрирует, как подключиться:

val db = MongoClients.create(
    clientSettings(
      "DATABASE_UID",
      "LOCATION"
    ).build()
  ).getDatabase("DATABASE_ID")


/**
 * Creates a connection to a Firestore with MongoDB Compatibility database.
 * @param databaseUid The uid of the database to connect to as a string. For example: f116f93a-519c-208a-9a72-3ef6c9a1f081
 * @param locationId The location of the database to connect to, for example: nam5, us-central1, us-east4 etc...
 * @param environment Determines whether to try and fetch an authentication credential from the
 * Compute Engine VM metadata service or whether to call gcloud.
 */
private static MongoClientSettings.Builder clientSettings(
  String databaseUid: String
  String locationId:String
): MongoClientSettings.Builder {
  MongoCredential credential =
    MongoCredential.createOidcCredential(null)
      .withMechanismProperty(
        MongoCredential.OIDC_CALLBACK_KEY,
        new MongoCredential.OidcCallback() {
          @Override
          MongoCredential.OidcCallbackResult onRequest(
MongoCredential.OidcCallbackContext context) {
     // Customize this credential builder for additional credential types.
     GoogleCredentials credentials = GoogleCredentials.getApplicationDefault();
            return new MongoCredential.OidcCallbackResult(
         credentials.getAccessToken().getTokenValue(),
         Duration.between(Instant.now(),
credentials.getAccessToken().getExpirationTime().toInstant()));
          }
        },
      );
  return MongoClientSettings.builder()
    .hosts(listOf(ServerAddress(
        "$databaseUid.$locationId.firestore.goog", 443)))
    .credential(credential)
    .applyToClusterSettings(builder ->
         builder.mode(ClusterConnectionMode.LOAD_BALANCED))
    ).applyToSslSettings(ssl -> ssl.enabled(true)).retryWrites(false);
}

Заменить следующее:

  • DATABASE_UID : название вашего проекта.
  • LOCATION : местоположение вашей базы данных.
  • DATABASE_ID идентификатор базы данных.

Подключение из виртуальной Compute Engine

Вы можете аутентифицироваться и подключаться к своей базе данных, используя учётную запись сервиса Compute Engine . Для этого создайте IAM-политику для проекта Google Cloud , содержащего вашу базу данных.

Прежде чем начать

Настройте управляемую пользователем учетную запись службы для вашей виртуальной машины:

Запишите адрес электронной почты вашей учетной записи.

Настроить учетные данные

Чтобы предоставить учетной записи службы роль roles/datastore.user для чтения и записи в Cloud Firestore , выполните следующую команду:

gcloud projects add-iam-policy-binding PROJECT_NAME --member="SERVICE_ACCOUNT_EMAIL" --role=roles/datastore.user

Заменить следующее:

  • PROJECT_NAME : название вашего проекта.
  • SERVICE_ACCOUNT_EMAIL : адрес электронной почты для созданной вами учетной записи службы.

Построить строку подключения

Для построения строки подключения используйте следующий формат:

mongodb://DATABASE_UID.LOCATION.firestore.goog:443/DATABASE_ID?loadBalanced=true&tls=true&retryWrites=false&authMechanism=MONGODB-OIDC&authMechanismProperties=ENVIRONMENT:gcp,TOKEN_RESOURCE:FIRESTORE

Заменить следующее:

  • DATABASE_UID : название вашего проекта.
  • LOCATION : местоположение вашей базы данных.
  • DATABASE_ID идентификатор базы данных.

Дополнительную информацию о получении UID и местоположения см. в разделе Получение строки подключения .

Подключитесь с помощью временного токена доступа

Вы можете использовать временный токен доступа Google Cloud для запуска диагностических инструментов, таких как mongosh . Для аутентификации с помощью краткосрочного токена доступа можно использовать gcloud auth print-access-token . Этот токен действителен в течение одного часа.

Например, используйте следующую команду для подключения к базе данных с помощью mongosh :

mongosh --tls \
      --username access_token --password $(gcloud auth print-access-token) \
      'mongodb://UID.LOCATION.firestore.goog:443/DATABASE_ID?loadBalanced=true&authMechanism=PLAIN&authSource=$external&retryWrites=false'

Заменить следующее:

  • DATABASE_UID : UID базы данных
  • LOCATION : местоположение базы данных
  • DATABASE_ID : идентификатор базы данных