اصالت‌سنجی و متصل شدن به پایگاه داده

الزامات اتصال

موارد زیر برای مشتریان Cloud Firestore الزامی است:

  • درایورها باید در حالت load balanced متصل شوند. این کار مانع از این می‌شود که درایورها تلاش کنند توپولوژی دقیق سروری را که به آن متصل می‌شوند درک کنند.
  • درایورها باید با SSL فعال متصل شوند.
  • درایورها باید نوشتن‌های قابل‌تکرار را غیرفعال کنند. ‫Cloud Firestore از نوشتن‌های قابل‌تکرار پشتیبانی نمی‌کند. نیازی نیست خواندن‌های قابل‌تکرار را غیرفعال کنید چون پشتیبانی می‌شوند.

بازیابی کردن رشته اتصال

رشته اتصال پایگاه داده به شناسه کاربری پایگاه داده، مکان پایگاه داده، و سازوکار اصالت‌سنجی بستگی دارد. دستورالعمل‌های زیر نحوه تشکیل رشته اتصال را شرح می‌دهد.

رشته اتصال دقیق به سازوکار اصالت‌سنجی بستگی دارد، اما رشته اتصال پایه از قالب زیر استفاده می‌کند:

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

می‌توانید رشته اتصال پایه را به یکی از روش‌های زیر دریافت کنید:

کنسول Firebase
  1. در کنسول Firebase، به صفحه Firestore Database بروید.

    رفتن به Firestore Database

  2. روی پایگاه داده‌ای که می‌خواهید اصالت‌سنجی شود کلیک کنید.
  3. در پانل کاوشگر، روی مشاهده موارد بیشتر کلیک کنید.
  4. Connect using MongoDB tools (اتصال بااستفاده از ابزارهای MongoDB) را انتخاب کنید.
  5. رشته اتصال را کپی کنید.
gcloud

از gcloud firestore database describe برای بازیابی UID و اطلاعات مکان استفاده کنید:

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

DATABASE_ID را با شناسه پایگاه داده جایگزین کنید.

برونداد شامل مکان و شناسه کاربری پایگاه داده است. از این اطلاعات برای ساختن رشته اتصال پایه استفاده کنید.

از رشته اتصال پایه و یکی از روش‌های زیر برای اصالت‌سنجی و اتصال به پایگاه داده‌تان استفاده کنید:

اتصال با نام کاربری و گذرواژه (SCRAM)

برای ایجاد اطلاعات کاربری برای پایگاه داده‌تان و متصل شدن به پایگاه داده‌تان، این مراحل را دنبال کنید.

قبل از شروع

برای دریافت اجازه‌های لازم برای ایجاد کاربر، از سرپرستتان بخواهید نقش «مدیریت هویت و دسترسی» userCredsAdmin (roles/datastore.userCredsAdmin) را در پایگاه داده‌تان به شما اعطا کند. برای اطلاعات بیشتر درباره اعطای نقش‌ها، مدیریت دسترسی به پروژه‌ها، پوشه‌ها، و سازمان‌ها را ببینید.

همچنین ممکن است بتوانید اجازه‌های لازم را ازطریق نقش‌های سفارشی یا دیگر نقش‌های ازپیش تعریف‌شده دریافت کنید.

ایجاد کردن کاربر و متصل شدن به پایگاه داده

برای ایجاد کاربر برای پایگاه داده Cloud Firestore، از یکی از روش‌های زیر استفاده کنید:

کنسول Firebase
  1. در کنسول Firebase، به صفحه Firestore Database بروید.

    رفتن به Firestore Database

  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"'
    موارد زیر را جایگزین کنید:
جاوا

این بخش نمونه کدی برای ایجاد اعتبارنامه کاربر و پیکربندی خط‌مشی IAM بااستفاده از کتابخانه‌های مشتری اداری Java ارائه می‌دهد. این نمونه از کتابخانه Firestore Admin Client برای ایجاد نام کاربری و گذرواژه، و از کتابخانه Google Cloud Resource Manager برای پیکربندی IAM استفاده می‌کند.

برای ساخت‌های 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);
    }
  }
}
پایتون

این بخش نمونه کدی برای ایجاد اعتبارنامه کاربر و پیکربندی خط‌مشی IAM بااستفاده از کتابخانه‌های کارخواه مدیریتی Python ارائه می‌دهد. این نمونه از کتابخانه کارخواه Google Cloud Firestore API برای ایجاد نام کاربری و گذرواژه، و از کتابخانه کارخواه Google Cloud Iam API و کتابخانه کارخواه Google Cloud Resource Manager API برای پیکربندی IAM استفاده می‌کند.

کتابخانه‌های 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 کتابخانه استاندارد OAuth استفاده می‌کند.

این کتابخانه به شما امکان می‌دهد از انواع مختلفی از اصالت‌سنجی استفاده کنید (اعتبارنامه‌های پیش‌فرض برنامه، فدراسیون هویت حجم کاری).

این کار مستلزم افزودن کتابخانه 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

می‌توانید بااستفاده از حساب سرویس Compute Engine، اصالت‌سنجی کنید و به پایگاه داده‌تان متصل شوید. برای انجام این کار، خط‌مشی IAM برای پروژه Google Cloud که حاوی پایگاه داده شما است ایجاد کنید.

قبل از شروع

حساب خدمات تحت مدیریت کاربر را برای VM خود پیکربندی کنید:

برای تکمیل پیکربندی خط‌مشی IAM برای حساب سرویس Compute Engine، دستورالعمل‌های بخش پیکربندی اطلاعات کاربری را ببینید.

پرواز رابط از Cloud Run

می‌توانید بااستفاده از حساب سرویس Cloud Run، اصالت‌سنجی کنید و به پایگاه داده‌تان متصل شوید. برای انجام این کار، خط‌مشی IAM برای پروژه Google Cloud که حاوی پایگاه داده شما است ایجاد کنید.

قبل از شروع

برای تکمیل پیکربندی خط‌مشی IAM برای حساب سرویس Cloud Run، دستورالعمل‌های بخش پیکربندی اطلاعات کاربری را ببینید.

پیکربندی اعتبارنامه‌ها

برای اعطای نقش 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 شناسه پایگاه داده.

برای اطلاعات بیشتر درباره بازیابی 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: شناسه یکتای پایگاه داده. برای مثال: f116f93a-519c-208a-9a72-3ef6c9a1f081
  • ‫LOCATION: مکان پایگاه داده
  • DATABASE_ID: شناسه پایگاه داده