ตรวจสอบสิทธิ์และเชื่อมต่อกับฐานข้อมูล

เกี่ยวข้องกับ Cloud Firestore Enterprise Edition เท่านั้น

ข้อกำหนดในการเชื่อมต่อ

ต่อไปนี้คือสิ่งที่จำเป็นสำหรับไคลเอ็นต์ที่เข้ากันได้กับ Cloud Firestore และ MongoDB

  • ผู้ขับขี่ต้องเชื่อมต่อในโหมด load balanced ซึ่งจะช่วยป้องกันไม่ให้ไดรเวอร์พยายามทำความเข้าใจโทโพโลยีเซิร์ฟเวอร์ที่แน่นอน ที่เชื่อมต่ออยู่
  • ไดรเวอร์ต้องเชื่อมต่อโดยเปิดใช้ SSL
  • ไดรเวอร์ต้องปิดใช้การเขียนที่ลองใหม่ได้ ปัจจุบัน Cloud Firestore ที่มีความเข้ากันได้กับ MongoDB ยังไม่รองรับการเขียนที่ลองใหม่ได้

เรียกข้อมูลสตริงการเชื่อมต่อ

สตริงการเชื่อมต่อฐานข้อมูลขึ้นอยู่กับ UID ของฐานข้อมูล ตำแหน่งของฐานข้อมูล และกลไกการตรวจสอบสิทธิ์ คำสั่งต่อไปนี้จะอธิบายวิธีสร้างสตริงการเชื่อมต่อ

สตริงการเชื่อมต่อที่แน่นอนจะขึ้นอยู่กับกลไกการตรวจสอบสิทธิ์ แต่สตริงการเชื่อมต่อฐานจะใช้รูปแบบต่อไปนี้

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 เพื่อดึงข้อมูล UID และตำแหน่ง

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

แทนที่ DATABASE_ID ด้วยรหัสฐานข้อมูล

เอาต์พุตประกอบด้วยตำแหน่งและ UID ของฐานข้อมูล ใช้ข้อมูลนี้ เพื่อสร้างสตริงการเชื่อมต่อฐาน

ใช้สตริงการเชื่อมต่อฐานและวิธีใดวิธีหนึ่งต่อไปนี้เพื่อตรวจสอบสิทธิ์ และเชื่อมต่อกับฐานข้อมูล

เชื่อมต่อด้วยชื่อผู้ใช้และรหัสผ่าน (SCRAM)

ทําตามขั้นตอนต่อไปนี้เพื่อสร้างข้อมูลเข้าสู่ระบบของผู้ใช้สําหรับฐานข้อมูลและ เชื่อมต่อกับฐานข้อมูล

ก่อนเริ่มต้น

หากต้องการรับสิทธิ์ที่จำเป็นในการสร้างผู้ใช้ ให้ขอให้ผู้ดูแลระบบ มอบบทบาท IAM userCredsAdmin (roles/datastore.userCredsAdmin) ให้คุณใน ฐานข้อมูล ดูข้อมูลเพิ่มเติมเกี่ยวกับการให้บทบาทได้ที่หัวข้อจัดการการเข้าถึงโปรเจ็กต์ โฟลเดอร์ และองค์กร

นอกจากนี้ คุณยังอาจได้รับสิทธิ์ที่จำเป็นผ่านบทบาทที่กำหนดเอง หรือบทบาทที่กำหนดไว้ล่วงหน้าอื่นๆ

สร้างผู้ใช้และเชื่อมต่อกับฐานข้อมูล

หากต้องการสร้างผู้ใช้สำหรับฐานข้อมูล Cloud Firestore ที่เข้ากันได้กับ MongoDB ให้ใช้วิธีใดวิธีหนึ่งต่อไปนี้

คอนโซล Google Cloud
  1. ในคอนโซล Google Cloud ให้ไปที่หน้าฐานข้อมูล

    ไปที่ฐานข้อมูล

  2. เลือกฐานข้อมูลจากรายการฐานข้อมูล
  3. ในเมนูการนำทาง ให้คลิกการตรวจสอบสิทธิ์
  4. คลิก Add User
  5. ป้อนชื่อผู้ใช้
  6. เลือกบทบาทสำหรับผู้ใช้ใหม่
  7. คลิกเพิ่ม

    รหัสผ่านของผู้ใช้ใหม่จะแสดงในกล่องโต้ตอบการยืนยัน

gcloud CLI
  1. หากต้องการตรวจสอบสิทธิ์ด้วย SCRAM คุณต้องสร้างข้อมูลเข้าสู่ระบบของผู้ใช้ก่อน ใช้คำสั่ง gcloud alpha firestore user-creds
    gcloud alpha 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"'
    แทนที่ค่าต่อไปนี้

ใช้สตริงการเชื่อมต่อต่อไปนี้เพื่อเชื่อมต่อกับฐานข้อมูลด้วย SCRAM

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

แทนที่ค่าต่อไปนี้

  • USERNAME: ชื่อผู้ใช้
  • PASSWORD: รหัสผ่านที่คุณสร้างสำหรับผู้ใช้รายนี้
  • UID: UID ของฐานข้อมูล
  • LOCATION: ตำแหน่งของฐานข้อมูล
  • DATABASE_ID: รหัสฐานข้อมูล

เชื่อมต่อกับไลบรารีการตรวจสอบสิทธิ์ของ Google

ตัวอย่างโค้ดต่อไปนี้จะลงทะเบียนตัวแฮนเดิลการเรียกกลับของ OIDC โดยใช้ไลบรารี OAuth มาตรฐาน Google Cloud

ไลบรารีนี้ช่วยให้คุณใช้การตรวจสอบสิทธิ์ได้หลายประเภท (ข้อมูลเข้าสู่ระบบเริ่มต้นของแอปพลิเคชัน, การรวมข้อมูลประจำตัวของเวิร์กโหลด)

ซึ่งต้องเพิ่มไลบรารีการตรวจสอบสิทธิ์เป็นทรัพยากร Dependency ดังนี้

// 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: ชื่อโปรเจ็กต์
  • LOCATION: ตำแหน่งของฐานข้อมูล
  • DATABASE_ID รหัสฐานข้อมูล

เชื่อมต่อจาก VM ของ Compute Engine

คุณตรวจสอบสิทธิ์และเชื่อมต่อกับฐานข้อมูลได้โดยใช้Compute Engineบัญชีบริการ โดยสร้างนโยบาย IAM สำหรับโปรเจ็กต์ Google Cloud ที่มีฐานข้อมูล

ก่อนเริ่มต้น

วิธีกำหนดค่าบัญชีบริการที่ผู้ใช้จัดการสำหรับ VM

จดอีเมลบัญชีบริการ

กำหนดค่าข้อมูลเข้าสู่ระบบ

หากต้องการให้สิทธิ์บัญชีบริการในroles/datastore.userสำหรับการอ่านและเขียน ไปยัง Cloud Firestore ให้เรียกใช้คำสั่งต่อไปนี้

gcloud projects add-iam-policy-binding PROJECT_NAME --member="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: ชื่อโปรเจ็กต์
  • LOCATION: ตำแหน่งของฐานข้อมูล
  • DATABASE_ID รหัสฐานข้อมูล

ดูข้อมูลเพิ่มเติมเกี่ยวกับการดึง UID และตำแหน่งได้ที่ ดึงข้อมูลสตริงการเชื่อมต่อ

เชื่อมต่อด้วยโทเค็นเพื่อการเข้าถึงชั่วคราว

คุณสามารถใช้โทเค็นเพื่อเข้าถึงชั่วคราว Google Cloud เพื่อเรียกใช้เครื่องมือวินิจฉัย เช่น mongosh คุณใช้ gcloud auth print-access-token เพื่อตรวจสอบสิทธิ์ด้วยโทเค็นเพื่อการเข้าถึงระยะสั้นได้ โทเค็นนี้มีอายุการใช้งาน 1 ชั่วโมง

เช่น ใช้คำสั่งต่อไปนี้เพื่อเชื่อมต่อกับฐานข้อมูลด้วย 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: UID ของฐานข้อมูล
  • LOCATION: ตำแหน่งของฐานข้อมูล
  • DATABASE_ID: รหัสฐานข้อมูล