डेटाबेस से कनेक्ट करने और पुष्टि करने का तरीका

कनेक्शन से जुड़ी ज़रूरी शर्तें

Cloud Firestore क्लाइंट के लिए, ये चीज़ें ज़रूरी हैं:

  • ड्राइवर, load balanced मोड में कनेक्ट होने चाहिए. इससे ड्राइवर, उस सर्वर टोपोलॉजी को समझने की कोशिश नहीं करते जिससे वे कनेक्ट हो रहे हैं.
  • ड्राइवर, एसएसएल की सुविधा चालू करके कनेक्ट होने चाहिए.
  • ड्राइवर, फिर से लिखने की सुविधा बंद करके कनेक्ट होने चाहिए. Cloud Firestore फिर से लिखने की सुविधा के साथ काम नहीं करता. आपको फिर से पढ़ने की सुविधा बंद करने की ज़रूरत नहीं है, क्योंकि यह सुविधा काम करती है.

कनेक्शन स्ट्रिंग वापस पाना

डेटाबेस की कनेक्शन स्ट्रिंग, डेटाबेस के यूआईडी, डेटाबेस की जगह, और पुष्टि करने के तरीके पर निर्भर करती है. यहां दिए गए निर्देशों में, कनेक्शन स्ट्रिंग बनाने का तरीका बताया गया है.

कनेक्शन स्ट्रिंग, पुष्टि करने के तरीके पर निर्भर करती है. हालांकि, बेस कनेक्शन स्ट्रिंग के लिए इस फ़ॉर्मैट का इस्तेमाल किया जाता है:

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 का इस्तेमाल करें:

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

DATABASE_ID की जगह डेटाबेस आईडी डालें.

आउटपुट में, डेटाबेस की जगह और यूआईडी शामिल होता है. बेस कनेक्शन स्ट्रिंग बनाने के लिए, इस जानकारी का इस्तेमाल करें.

अपने डेटाबेस से पुष्टि करने और कनेक्ट करने के लिए, बेस कनेक्शन स्ट्रिंग और इनमें से कोई एक तरीका अपनाएं:

उपयोगकर्ता नाम और पासवर्ड (SCRAM) की मदद से कनेक्ट करना

अपने डेटाबेस के लिए उपयोगकर्ता क्रेडेंशियल बनाने और उससे कनेक्ट करने के लिए, यह तरीका अपनाएं.

शुरू करने से पहले

उपयोगकर्ता बनाने के लिए ज़रूरी अनुमतियां पाने के लिए, अपने एडमिन से कहें कि वह आपको अपने डेटाबेस पर userCredsAdmin (roles/datastore.userCredsAdmin) IAM की भूमिका असाइन करे. भूमिकाएं असाइन करने के बारे में ज़्यादा जानने के लिए, प्रोजेक्ट, फ़ोल्डर, और संगठनों का ऐक्सेस मैनेज करना लेख पढ़ें.

आपको कस्टम भूमिका या अन्य पहले से तय भूमिकाओं के ज़रिए भी ज़रूरी अनुमतियां मिल सकती हैं.

उपयोगकर्ता बनाना और डेटाबेस से कनेक्ट करना

अपने Cloud Firestore डेटाबेस के लिए उपयोगकर्ता बनाने के लिए, इनमें से कोई एक तरीका अपनाएं:

Firebase कंसोल
  1. Firebase कंसोल में, Firestore डेटाबेस पेज पर जाएं.

    Firestore डेटाबेस पर जाएं

  2. डेटाबेस की सूची में से कोई डेटाबेस चुनें.
  3. नेविगेशन मेन्यू में, सुरक्षा पर क्लिक करें.
  4. उपयोगकर्ता जोड़ें पर क्लिक करें.
  5. कोई उपयोगकर्ता नाम डालें.
  6. नए उपयोगकर्ता के लिए कोई भूमिका चुनें.
  7. उपयोगकर्ता जोड़ें पर क्लिक करें.
  8. पुष्टि करने वाले डायलॉग में, नए उपयोगकर्ता का पासवर्ड दिखेगा.

gcloud CLI
  1. SCRAM की मदद से पुष्टि करने के लिए, सबसे पहले उपयोगकर्ता क्रेडेंशियल बनाना ज़रूरी है. gcloud firestore user-creds कमांड का इस्तेमाल करें:
    gcloud 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"'
    इन्हें बदलें:
    • PROJECT_NAME: आपके प्रोजेक्ट का नाम.
    • PROJECT_NUMBER: प्रोजेक्ट नंबर.
    • DATABASE_ID: डेटाबेस आईडी.
    • USERNAME: वह उपयोगकर्ता नाम जिसे आपने पहले बनाया था.
    • CONDITION_TITLE: इस शर्त के लिए कोई टाइटल. इस शर्त से, सिर्फ़ इस डेटाबेस का ऐक्सेस मिलता है .
Java

इस सेक्शन में, Java एडमिन क्लाइंट लाइब्रेरी का इस्तेमाल करके, उपयोगकर्ता क्रेडेंशियल बनाने और IAM नीति को कॉन्फ़िगर करने के लिए, कोड का एक उदाहरण दिया गया है. इस सैंपल में, उपयोगकर्ता नाम और पासवर्ड बनाने के लिए Firestore Admin Client लाइब्रेरी और IAM को कॉन्फ़िगर करने के लिए, Google Cloud Resource Manager लाइब्रेरी का इस्तेमाल किया गया है.

Maven बिल्ड के लिए, इन कोऑर्डिनेट का इस्तेमाल किया जा सकता है:

com.google.cloud:google-cloud-firestore-admin:3.33.1
com.google.cloud:google-cloud-resourcemanager:1.76.0

उपयोगकर्ता क्रेडेंशियल और IAM नीति उपलब्ध कराएं:

import com.google.cloud.firestore.v1.FirestoreAdminClient;
import com.google.cloud.resourcemanager.v3.ProjectName;
import com.google.cloud.resourcemanager.v3.ProjectsClient;
import com.google.firestore.admin.v1.CreateUserCredsRequest;
import com.google.firestore.admin.v1.GetUserCredsRequest;
import com.google.firestore.admin.v1.UserCreds;
import com.google.iam.v1.Binding;
import com.google.iam.v1.GetIamPolicyRequest;
import com.google.iam.v1.GetPolicyOptions;
import com.google.iam.v1.Policy;
import com.google.iam.v1.SetIamPolicyRequest;
import com.google.protobuf.FieldMask;
import com.google.type.Expr;

public class FirestoreUserCredsExample {
  /**
   *   Provision user credentials and configure an IAM policy to allow SCRAM authentication into the
   *   specified Firestore with Mongo Compatibility database.
   */
  private static void provisionFirestoreUserCredsAndIAM(
      String projectId, String databaseId, String userName) throws Exception {
    UserCreds userCreds = createUserCreds(projectId, databaseId, userName);

    // Note the password returned in the UserCreds proto - it cannot be retrieved again
    // after the initial call to the createUserCreds API.
    System.out.printf(
        "Created credentials for username: %s:\nIAM principal: %s\nPassword: [%s]\n",
        userName, userCreds.getResourceIdentity().getPrincipal(), userCreds.getSecurePassword());

    // Provision an IAM binding for the principal associated with these user credentials.
    updateIamPolicyForUserCreds(projectId, databaseId, userName, userCreds);

    // Emit the password again.
    System.out.printf(
        "Successfully configured IAM policy for database: %s, username: %s\n",
        databaseId, userName);
    System.out.printf("Please make a note of the password: [%s]\n", userCreds.getSecurePassword());
  }

  /** Provision new user credentials using the FirestoreAdminClient. */
  private static UserCreds createUserCreds(String projectId, String databaseId, String userName)
      throws Exception {
    FirestoreAdminClient firestoreAdminClient = FirestoreAdminClient.create();
    return firestoreAdminClient.createUserCreds(
        CreateUserCredsRequest.newBuilder()
            .setParent(String.format("projects/%s/databases/%s", projectId, databaseId))
            .setUserCredsId(userName)
            .build());
  }

  /** Update the IAM policy using the Resource Manager ProjectsClient. */
  private static void updateIamPolicyForUserCreds(
      String projectId, String databaseId, String userName, UserCreds userCreds) throws Exception {
    try (ProjectsClient projectsClient = ProjectsClient.create()) {
      ProjectName projectName = ProjectName.of(projectId);

      // Get the current IAM policy.
      Policy currentPolicy =
          projectsClient.getIamPolicy(
              GetIamPolicyRequest.newBuilder()
                  .setResource(projectName.toString())
                  .setOptions(GetPolicyOptions.newBuilder().setRequestedPolicyVersion(3).build())
                  .build());

      String role = "roles/datastore.user";
      String title = String.format("Conditional IAM binding for %s", userName);
      String expression =
          String.format("resource.name == \"projects/%s/databases/%s\"", projectId, databaseId);

      // Construct an updated IAM policy with an additional binding for the user credentials.
      Policy.Builder policyBuilder = currentPolicy.toBuilder();
      Binding newBinding =
          Binding.newBuilder()
              .setRole(role)
              .setCondition(Expr.newBuilder().setTitle(title).setExpression(expression).build())
              .addMembers(userCreds.getResourceIdentity().getPrincipal())
              .build();
      policyBuilder.addBindings(newBinding);

      // Update the policy
      SetIamPolicyRequest request =
          SetIamPolicyRequest.newBuilder()
              .setResource(projectName.toString())
              .setPolicy(policyBuilder.build())
              .setUpdateMask(FieldMask.newBuilder().addPaths("bindings").addPaths("etag").build())
              .build();
      System.out.println(request);

      Policy updatedPolicy = projectsClient.setIamPolicy(request);
      System.out.println("Policy updated successfully: " + updatedPolicy);
    }
  }
}
Python

इस सेक्शन में, Python एडमिन क्लाइंट लाइब्रेरी का इस्तेमाल करके, उपयोगकर्ता क्रेडेंशियल बनाने और IAM नीति को कॉन्फ़िगर करने के लिए, कोड का एक उदाहरण दिया गया है. इस सैंपल में, उपयोगकर्ता नाम और पासवर्ड बनाने के लिए Google Cloud Firestore API क्लाइंट लाइब्रेरी लाइब्रेरी और IAM को कॉन्फ़िगर करने के लिए, Google Cloud Iam API क्लाइंट लाइब्रेरी और Google Cloud Resource Manager API क्लाइंट लाइब्रेरी का इस्तेमाल किया गया है.

ज़रूरी Python लाइब्रेरी को pip टूल की मदद से इंस्टॉल किया जा सकता है:

pip install google-cloud-iam
pip install google-cloud-firestore
pip install google-cloud-resource-manager

उपयोगकर्ता क्रेडेंशियल और IAM नीति उपलब्ध कराएं:

from google.cloud import resourcemanager_v3
from google.cloud.firestore_admin_v1 import FirestoreAdminClient
from google.cloud.firestore_admin_v1 import types
from google.iam.v1 import iam_policy_pb2
from google.iam.v1 import policy_pb2
from google.type import expr_pb2

def create_user_creds(project_id: str, database_id: str, user_name: str):
  """Provision new user credentials using the FirestoreAdminClient."""
  client = FirestoreAdminClient()
  request = types.CreateUserCredsRequest(
      parent=f'projects/{project_id}/databases/{database_id}',
      user_creds_id=user_name,
  )
  response = client.create_user_creds(request)
  return response

def update_iam_policy_for_user_creds(
    project_id: str, database_id: str, user_name: str, user_creds
):
  """Update the IAM policy using the Resource Manager ProjectsClient."""
  client = resourcemanager_v3.ProjectsClient()
  request = iam_policy_pb2.GetIamPolicyRequest()
  request.resource = f'projects/{project_id}'
  request.options.requested_policy_version = 3

  # Get the current IAM policy
  current_policy = client.get_iam_policy(request)

  # Construct an updated IAM policy with an additional binding
  # for the user credentials.
  updated_policy = policy_pb2.Policy()
  binding = policy_pb2.Binding()
  iam_condition = expr_pb2.Expr()

  iam_condition.title = f'Conditional IAM binding for {user_name}'
  iam_condition.expression = (
      f'resource.name == "projects/{project_id}/databases/{database_id}"'
  )

  binding.role = 'roles/datastore.user'
  binding.condition.CopyFrom(iam_condition)
  binding.members.append(user_creds.resource_identity.principal)
  updated_policy.bindings.append(binding)

  # Update the policy
  updated_policy.MergeFrom(current_policy)
  set_policy_request = iam_policy_pb2.SetIamPolicyRequest()
  set_policy_request.resource = f'projects/{project_id}'
  set_policy_request.policy.CopyFrom(updated_policy)

  final_policy = client.set_iam_policy(set_policy_request)
  print(f'Policy updated successfully {final_policy}')

def provision_firestore_user_creds_and_iam(
    project_id: str, database_id: str, user_name: str
):
  """Provision user credentials and configure an IAM policy."""
  user_creds = create_user_creds(project_id, database_id, user_name)

  # Note the password returned in the UserCreds proto - it cannot be
  # retrieved again after the initial call to the create_user_creds API.
  print(f'Created credentials for username: {user_name}')
  print(f'IAM principal: {user_creds.resource_identity.principal}')
  print(f'Password: [{user_creds.secure_password}]')

  # Provision an IAM binding for the principal associated with
  # these user credentials.
  update_iam_policy_for_user_creds(
      project_id, database_id, user_name, user_creds
  )

  # Emit the password again
  print(
      f'Successfully configured IAM policy for database: {database_id},'
      f' username: {user_name}'
  )
  print(f'Please make a note of the password: [{user_creds.secure_password}]')

SCRAM की मदद से अपने डेटाबेस से कनेक्ट करने के लिए, इस कनेक्शन स्ट्रिंग का इस्तेमाल करें:

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

इन्हें बदलें:

  • USERNAME: उपयोगकर्ता नाम.
  • PASSWORD: वह पासवर्ड जो आपने इस उपयोगकर्ता के लिए जनरेट किया है.
  • UID: डेटाबेस का यूआईडी. उदाहरण के लिए: f116f93a-519c-208a-9a72-3ef6c9a1f081
  • LOCATION: डेटाबेस की जगह.
  • DATABASE_ID: डेटाबेस आईडी.

Google Auth Library की मदद से कनेक्ट करना

कोड के इस सैंपल में, OIDC कॉलबैक हैंडलर रजिस्टर किया गया है. इसमें Google Cloud standard OAuth library का इस्तेमाल किया गया है.

इस लाइब्रेरी की मदद से, पुष्टि करने के कई अलग-अलग तरीके (ऐप्लिकेशन डिफ़ॉल्ट क्रेडेंशियल, वर्कलोड आइडेंटिटी फ़ेडरेशन) इस्तेमाल किए जा सकते हैं.

इसके लिए, auth लाइब्रेरी को डिपेंडेंसी के तौर पर जोड़ना ज़रूरी है:

// 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: डेटाबेस का यूआईडी. उदाहरण के लिए: f116f93a-519c-208a-9a72-3ef6c9a1f081
  • LOCATION: आपके डेटाबेस की जगह.
  • DATABASE_ID डेटाबेस आईडी.

किसी कंप्यूट एनवायरमेंट से कनेक्ट करनाGoogle Cloud

इस सेक्शन में, Cloud Firestore से Google Cloud कंप्यूट एनवायरमेंट, जैसे कि Compute Engine या Cloud Run सेवा या जॉब से कनेक्ट करने का तरीका बताया गया है.

Compute Engine VM से कनेक्ट करना

Compute Engine सेवा खाते का इस्तेमाल करके, अपने डेटाबेस से पुष्टि की जा सकती है और उससे कनेक्ट किया जा सकता है.Compute Engine इसके लिए, Google Cloud प्रोजेक्ट के लिए IAM नीति बनाएं जिसमें आपका डेटाबेस मौजूद है.

शुरू करने से पहले

अपने VM के लिए, उपयोगकर्ता मैनेज करने वाला सेवा खाता कॉन्फ़िगर करें:

अपने Compute Engine सेवा खाते के लिए IAM नीति का कॉन्फ़िगरेशन पूरा करने के लिए, क्रेडेंशियल कॉन्फ़िगर करना सेक्शन में दिए गए निर्देश देखें.

Cloud Run से कनेक्ट करना

Cloud Run सेवा खाते का इस्तेमाल करके, अपने डेटाबेस से पुष्टि की जा सकती है और उससे कनेक्ट किया जा सकता है.Cloud Run इसके लिए, Google Cloud प्रोजेक्ट के लिए IAM नीति बनाएं जिसमें आपका डेटाबेस मौजूद है.

शुरू करने से पहले

  • Cloud Run के लिए सेवा खाता कॉन्फ़िगर करने के लिए, सेवा की पहचान
      कॉन्फ़िगर करना लेख पढ़ें
    • यह जानने के लिए कि आपके Cloud Run सेवा से पहले से कौनसा सेवा खाता जुड़ा है, gcloud run services describe देखें

अपने Cloud Run सेवा खाते के लिए IAM नीति का कॉन्फ़िगरेशन पूरा करने के लिए, क्रेडेंशियल कॉन्फ़िगर करना सेक्शन में दिए गए निर्देश देखें.

क्रेडेंशियल कॉन्फ़िगर करना

पढ़ने और उसमें लिखने के लिए, सेवा खाते को roles/datastore.user भूमिका असाइन करने के लिए Cloud Firestore को, यह कमांड रन करें:

gcloud projects add-iam-policy-binding PROJECT_NAME --member="serviceAccount: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: डेटाबेस का यूआईडी. उदाहरण के लिए: f116f93a-519c-208a-9a72-3ef6c9a1f081
  • LOCATION: आपके डेटाबेस की जगह.
  • DATABASE_ID डेटाबेस आईडी.

यूआईडी और जगह की जानकारी वापस पाने के बारे में ज़्यादा जानने के लिए, कनेक्शन स्ट्रिंग वापस पाना लेख पढ़ें.

कुछ समय के लिए मान्य ऐक्सेस टोकन की मदद से कनेक्ट करना

गड़बड़ी की जानकारी पाने वाले टूल चलाने के लिए, कुछ समय के लिए मान्य 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: डेटाबेस का यूआईडी. उदाहरण के लिए: f116f93a-519c-208a-9a72-3ef6c9a1f081
  • LOCATION: डेटाबेस की जगह
  • DATABASE_ID: डेटाबेस आईडी