S'authentifier et se connecter à une base de données

Cette page explique comment s'authentifier et se connecter à votre base de données Firestore compatible avec MongoDB.

Exigences de connexion

Les éléments suivants sont requis pour les clients Firestore compatibles avec MongoDB :

  • Les pilotes doivent se connecter en mode load balanced. Cela empêche les pilotes d'essayer de comprendre la topologie exacte du serveur auquel ils se connectent.
  • Les pilotes doivent se connecter avec le protocole SSL activé.
  • Les pilotes doivent désactiver les écritures réessayables. Firestore compatible avec MongoDB n'est actuellement pas compatible avec les écritures pouvant être relancées.

Récupérer la chaîne de connexion

La chaîne de connexion à la base de données dépend de l'UID de la base de données, de son emplacement et du mécanisme d'authentification. Les instructions suivantes décrivent la façon dont la chaîne de connexion est formée.

La chaîne de connexion exacte dépend du mécanisme d'authentification, mais la chaîne de connexion de base utilise le format suivant :

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

Vous pouvez obtenir la chaîne de connexion de base de l'une des manières suivantes :

Console
  1. Dans la console Google Cloud , accédez à la page Bases de données.

    Accéder à la page "Bases de données"

  2. Dans la liste des bases de données, cliquez sur l'ID de la base de données concernée.
  3. Le panneau Explorateur affiche la chaîne de connexion de base. Copiez et utilisez cette chaîne de connexion pour vous connecter à votre base de données.
gcloud

Utilisez gcloud firestore database describe pour récupérer l'UID et les informations de localisation :

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

Remplacez DATABASE_ID par l'ID de la base de données.

La sortie inclut l'emplacement et l'UID de la base de données. Utilisez ces informations pour construire la chaîne de connexion de base.

Utilisez la chaîne de connexion de base et l'une des méthodes suivantes pour vous authentifier et vous connecter à votre base de données :

Se connecter avec un nom d'utilisateur et un mot de passe (SCRAM)

Suivez ces étapes pour créer des identifiants utilisateur pour votre base de données et vous y connecter.

Avant de commencer

Pour obtenir les autorisations nécessaires pour créer un utilisateur, demandez à votre administrateur de vous accorder le rôle IAM userCredsAdmin (roles/datastore.userCredsAdmin) sur votre base de données. Pour en savoir plus sur l'attribution de rôles, consultez la page Gérer l'accès aux projets, aux dossiers et aux organisations.

Vous pouvez également obtenir les autorisations requises avec des rôles personnalisés ou d'autres rôles prédéfinis.

Créer un utilisateur et se connecter à une base de données

Pour créer un utilisateur pour votre base de données Firestore compatible avec MongoDB, utilisez l'une des méthodes suivantes :

ConsoleGoogle Cloud
  1. Dans la console Google Cloud , accédez à la page Bases de données.

    Accéder à la page "Bases de données"

  2. Sélectionnez une base de données dans la liste.
  3. Dans le menu de navigation, cliquez sur Authentification.
  4. Cliquez sur Ajouter un utilisateur.
  5. Indiquez un nom d'utilisateur.
  6. Sélectionnez un rôle pour le nouvel utilisateur.
  7. Cliquez sur Ajouter.

    Le mot de passe du nouvel utilisateur s'affiche dans la boîte de dialogue de confirmation.

CLI gcloud
  1. Pour vous authentifier avec SCRAM, vous devez d'abord créer un identifiant utilisateur. Exécutez la commande gcloud alpha firestore user-creds :
    gcloud alpha firestore user-creds create USERNAME --database=DATABASE_ID
    Remplacez les éléments suivants :
    • USERNAME : nom d'utilisateur à créer.
    • DATABASE_ID : ID de la base de données.

    Le résultat de cette commande inclut le mot de passe de l'utilisateur.

    Le résultat se présente comme suit :

    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. Par défaut, ces nouvelles identifiants utilisateur ne disposent d'aucune autorisation. Pour obtenir un accès en lecture et en écriture à la base de données, ajoutez le rôle roles/datastore.user pour cette base de données spécifique :

    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"'
    Remplacez les éléments suivants :

Utilisez la chaîne de connexion suivante pour vous connecter à votre base de données avec SCRAM :

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

Remplacez les éléments suivants :

  • USERNAME : nom d'utilisateur.
  • PASSWORD : mot de passe que vous avez généré pour cet utilisateur.
  • UID : UID de la base de données.
  • LOCATION : emplacement de la base de données.
  • DATABASE_ID : ID de la base de données.

Se connecter à la bibliothèque Google Auth

L'exemple de code suivant enregistre un gestionnaire de rappel OIDC et utilise la bibliothèque OAuth standard.Google Cloud

Cette bibliothèque vous permet d'utiliser différents types d'authentification (Identifiants par défaut de l'application, fédération d'identité de charge de travail).

Pour cela, vous devez ajouter la bibliothèque d'authentification en tant que dépendance :

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

L'exemple de code suivant montre comment se connecter :

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

Remplacez les éléments suivants :

  • DATABASE_UID : nom de votre projet.
  • LOCATION : emplacement de votre base de données.
  • DATABASE_ID, l'ID de la base de données.

Se connecter à partir d'une VM Compute Engine

Vous pouvez vous authentifier et vous connecter à votre base de données à l'aide d'un compte de service Compute Engine. Pour ce faire, créez une stratégie IAM pour le projet Google Cloud qui contient votre base de données.

Avant de commencer

Configurez un compte de service géré par l'utilisateur pour votre VM :

Notez l'adresse e-mail de votre compte de service.

Configurer les identifiants

Pour accorder au compte de service le rôle roles/datastore.user pour la lecture et l'écriture dans Firestore, exécutez la commande suivante :

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

Remplacez les éléments suivants :

  • PROJECT_NAME : nom de votre projet.
  • SERVICE_ACCOUNT_EMAIL : adresse e-mail du compte de service que vous avez créé.

Construire la chaîne de connexion

Utilisez le format suivant pour créer la chaîne de connexion :

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

Remplacez les éléments suivants :

  • DATABASE_UID : nom de votre projet.
  • LOCATION : emplacement de votre base de données.
  • DATABASE_ID, l'ID de la base de données.

Pour savoir comment récupérer l'UID et l'emplacement, consultez Récupérer la chaîne de connexion.

Se connecter avec un jeton d'accès temporaire

Vous pouvez utiliser un jeton d'accès Google Cloud temporaire pour exécuter des outils de diagnostic tels que mongosh. Vous pouvez utiliser gcloud auth print-access-token pour vous authentifier avec un jeton d'accès à court terme. Ce jeton est valide pendant une heure.

Par exemple, utilisez la commande suivante pour vous connecter à votre base de données avec 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'

Remplacez les éléments suivants :

  • DATABASE_UID : UID de la base de données
  • LOCATION : emplacement de la base de données
  • DATABASE_ID : ID de la base de données