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

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

Conditions requises de connectivité

Les éléments suivants sont requis pour les clients Firestore compatible 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 SSL activé.
  • Les pilotes doivent désactiver les écritures réitérables. Firestore compatible avec MongoDB n'est actuellement pas compatible avec les écritures réitérables.

Récupérez 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 formation de la chaîne de connexion.

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 Google Cloud console, 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 Explorer 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 créer 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)

Pour créer des identifiants utilisateur pour votre base de données et vous y connecter, procédez comme suit :

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 via 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 Google Cloud console, 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 des identifiants 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 l'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 qui utilise la bibliothèque OAuth standardGoogle Cloud .

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

Pour ce faire, 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(
    connectIgnite(
      "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 Whether to try and fetch an auth credential from the GCE VM metadata service or whether to call gcloud.
 */
private static MongoClientSettings.Builder connectIgnite(
  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 : ID de la base de données.

Se connecter depuis 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éé.

Créer 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 : ID de la base de données.

Pour en savoir plus sur la récupération de l'UID et de l'emplacement, consultez la section 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 valable 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 base de données