Autenticar e se conectar a um banco de dados

Nesta página, descrevemos como autenticar e se conectar ao seu banco de dados do Firestore com compatibilidade com o MongoDB.

Requisitos de conexão

Os seguintes itens são necessários para clientes do Firestore com compatibilidade com o MongoDB:

  • Os motoristas precisam se conectar no modo load balanced. Isso impede que os drivers tentem entender a topologia exata do servidor a que estão se conectando.
  • Os drivers precisam se conectar com o SSL ativado.
  • Os drivers precisam desativar as gravações repetíveis. No momento, o Firestore com compatibilidade com o MongoDB não oferece suporte a gravações que podem ser repetidas.

Recuperar a string de conexão

A string de conexão do banco de dados depende do UID do banco de dados, da localização do banco de dados e do mecanismo de autenticação. As instruções a seguir descrevem como a string de conexão é formada.

A string de conexão exata depende do mecanismo de autenticação, mas a string de conexão básica usa o seguinte formato:

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

É possível conseguir a string de conexão básica de uma das seguintes maneiras:

Console
  1. No console do Google Cloud , acesse a página Bancos de dados.

    Acessar "Bancos de dados"

  2. Na lista de bancos de dados, clique no ID do banco de dados relevante.
  3. O painel Explorer mostra a string de conexão básica. Copie e use essa string de conexão para se conectar ao banco de dados.
gcloud

Use gcloud firestore database describe para recuperar o UID e as informações de local:

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

Substitua DATABASE_ID pelo ID do banco de dados.

A saída inclui o local e o UID do banco de dados. Use essas informações para construir a string de conexão básica.

Use a string de conexão básica e um dos seguintes métodos para autenticar e se conectar ao banco de dados:

Conectar com nome de usuário e senha (SCRAM)

Siga estas etapas para criar uma credencial de usuário para seu banco de dados e se conectar a ele.

Antes de começar

Para receber as permissões necessárias para criar um usuário, peça ao administrador para conceder a você o papel do IAM userCredsAdmin (roles/datastore.userCredsAdmin) no seu banco de dados. Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

Também é possível conseguir as permissões necessárias por meio de papéis personalizados ou de outros papéis predefinidos.

Criar um usuário e se conectar a um banco de dados

Para criar um usuário para seu banco de dados do Firestore com compatibilidade com o MongoDB, use um dos seguintes métodos:

Google Cloud console
  1. No console do Google Cloud , acesse a página Bancos de dados.

    Acessar "Bancos de dados"

  2. Selecione um banco de dados na lista.
  3. No menu de navegação, clique em Auth.
  4. Clique em Adicionar usuário.
  5. Digite um Nome de usuário.
  6. Selecione uma função para o novo usuário.
  7. Clique em Adicionar.

    A senha do novo usuário vai aparecer na caixa de diálogo de confirmação.

CLI da gcloud
  1. Para autenticar com SCRAM, primeiro crie uma credencial de usuário. Use o comando gcloud alpha firestore user-creds:
    gcloud alpha firestore user-creds create USERNAME --database=DATABASE_ID
    Substitua o seguinte:
    • USERNAME: o nome de usuário a ser criado.
    • DATABASE_ID: o ID do banco de dados.

    A saída desse comando inclui a senha do usuário.

    A saída será assim:

    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. Por padrão, essa nova credencial de usuário não tem permissões. Para acesso de leitura e gravação ao banco de dados, adicione a função roles/datastore.user a esse banco de dados específico:

    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"'
    Substitua o seguinte:

Use a seguinte string de conexão para se conectar ao banco de dados com SCRAM:

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

Substitua:

  • USERNAME: o nome de usuário.
  • PASSWORD: a senha gerada para esse usuário.
  • UID: o UID do banco de dados.
  • LOCATION: o local do banco de dados.
  • DATABASE_ID: o ID do banco de dados.

Conectar-se à biblioteca de autenticação do Google

A exemplo de código a seguir registra um manipulador de callback do OIDC e usa a Google Cloud biblioteca OAuth padrão.

Com ela, é possível usar vários tipos diferentes de autenticação (Application Default Credentials, federação de identidade da carga de trabalho).

Isso exige adicionar a biblioteca de autenticação como uma dependência:

// 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'

O exemplo de código a seguir demonstra como se conectar:

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));
}

Substitua:

  • DATABASE_UID: o nome do projeto.
  • LOCATION: o local do banco de dados.
  • DATABASE_ID o ID do banco de dados.

Conectar-se de uma VM do Compute Engine

É possível autenticar e se conectar ao banco de dados usando uma conta de serviço do Compute Engine. Para isso, crie uma política do IAM para o projeto Google Cloud que contém seu banco de dados.

Antes de começar

Configure uma conta de serviço gerenciado pelo usuário para sua VM:

Anote o e-mail da sua conta de serviço.

Configurar credenciais

Para conceder à conta de serviço o papel roles/datastore.user de leitura e gravação no Firestore, execute o seguinte comando:

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

Substitua:

  • PROJECT_NAME: o nome do projeto.
  • SERVICE_ACCOUNT_EMAIL: o endereço de e-mail da conta de serviço que você criou.

Construir a string de conexão

Use o seguinte formato para criar a string de conexão:

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

Substitua:

  • DATABASE_UID: o nome do projeto.
  • LOCATION: o local do banco de dados.
  • DATABASE_ID o ID do banco de dados.

Para mais informações sobre como recuperar o UID e o local, consulte Recuperar a string de conexão.

Conectar com um token de acesso temporário

Você pode usar um token de acesso Google Cloud temporário para executar ferramentas de diagnóstico como o mongosh. É possível usar gcloud auth print-access-token para autenticar com um token de acesso de curta duração. Esse token é válido por uma hora.

Por exemplo, use o seguinte comando para se conectar ao banco de dados com 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'

Substitua:

  • DATABASE_UID: o UID do banco de dados
  • LOCATION: o local do banco de dados
  • DATABASE_ID: um ID do banco de dados