ใช้ Admin SDK กับ Data Connect

Firebase Admin SDK คือชุดไลบรารีเซิร์ฟเวอร์ที่ช่วยให้คุณโต้ตอบกับ Firebase จากสภาพแวดล้อมที่มีสิทธิ์เพื่อดำเนินการต่างๆ เช่น ดำเนินการค้นหาและการเปลี่ยนแปลงในบริการ Firebase Data Connect เพื่อจัดการข้อมูลจำนวนมาก และการดำเนินการอื่นๆ ด้วยสิทธิ์ที่สูงขึ้นและข้อมูลเข้าสู่ระบบที่มีการแอบอ้างเป็นบุคคลอื่น

Admin SDK มี API ให้คุณเรียกใช้การดำเนินการทั้งในโหมดอ่าน/เขียนและโหมดอ่านอย่างเดียว การดำเนินการแบบอ่านอย่างเดียวช่วยให้คุณมั่นใจได้ว่าการใช้ฟังก์ชันการดูแลระบบที่แก้ไขข้อมูลในฐานข้อมูลไม่ได้

การตั้งค่า Admin SDK

หากต้องการเริ่มต้นใช้งาน Firebase Data Connect ในเซิร์ฟเวอร์ คุณจะต้องติดตั้งและตั้งค่า Admin SDK สำหรับ Node.js ก่อน

เริ่มต้น Admin SDK ในสคริปต์

หากต้องการเริ่มต้น SDK ให้นําเข้าส่วนขยาย Data Connect และประกาศรหัสและตําแหน่งบริการของโปรเจ็กต์


import { initializeApp } from 'firebase-admin/app';
import { getDataConnect } from 'firebase-admin/data-connect';

// If you'd like to use OAuth2 flows and other credentials to log in,
// visit https://firebase.google.com/docs/admin/setup#initialize-sdk
// for alternative ways to initialize the SDK.

const app = initializeApp();

const dataConnect = getDataConnect({
    serviceId: 'serviceId',
    location: 'us-west2'
});

ออกแบบการค้นหาและการกลายพันธุ์เพื่อใช้กับ Admin SDK

Admin SDK มีประโยชน์สำหรับการทดสอบการดำเนินการ Data Connect โดยพิจารณาจากสิ่งต่อไปนี้

ทําความเข้าใจ SDK และคำสั่งการดำเนินการ @auth(level: NO_ACCESS)

เนื่องจาก Admin SDK ทํางานโดยมีสิทธิ์ จึงสามารถดําเนินการค้นหาและการดัดแปลงได้โดยไม่คำนึงถึงระดับการเข้าถึงที่ตั้งค่าโดยใช้คําแนะนํา @auth รวมถึงระดับ NO_ACCESS

หากจัดระเบียบการค้นหาและการดัดแปลงการดูแลระบบใน.gqlไฟล์ต้นทางเพื่อนำเข้าไปยังสคริปต์การดูแลระบบควบคู่ไปกับการดำเนินการกับไคลเอ็นต์ Firebase ขอแนะนำให้คุณทําเครื่องหมายการดำเนินการด้านการดูแลระบบโดยไม่มีระดับการเข้าถึงการให้สิทธิ์ หรืออาจระบุให้ชัดเจนยิ่งขึ้นโดยตั้งค่าเป็นNO_ACCESS ไม่ว่าจะด้วยวิธีใด การดำเนินการดังกล่าวจะไม่สามารถดำเนินการจากไคลเอ็นต์หรือในบริบทอื่นๆ ที่ไม่มีสิทธิ์

ใช้ SDK กับโปรแกรมจำลอง Data Connect

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

Firebase Admin SDK จะเชื่อมต่อกับData Connect emuเลเตอร์โดยอัตโนมัติเมื่อตั้งค่าตัวแปรสภาพแวดล้อม DATA_CONNECT_EMULATOR_HOST ดังนี้

export DATA_CONNECT_EMULATOR_HOST="127.0.0.1:9399"

ดูข้อมูลเพิ่มเติมได้ที่

ใช้กรณีการใช้งานทั่วไป

Admin SDK มีไว้สําหรับการดำเนินการที่มีสิทธิ์ในข้อมูลสําคัญ

Admin SDK มีอินเทอร์เฟซ 2 รายการ ได้แก่

  • อินเทอร์เฟซทั่วไปสําหรับการดําเนินการแบบอ่านอย่างเดียวหรืออ่าน/เขียนส่วนใหญ่ ซึ่งโค้ดของคุณจะใช้การค้นหาและการดัดแปลง และส่งไปยังเมธอดexecuteGraphqlแบบอ่าน/เขียนหรือexecuteGraphqlReadแบบอ่านอย่างเดียว
  • อินเทอร์เฟซเฉพาะสําหรับการดําเนินการกับข้อมูลจํานวนมาก ซึ่งจะแสดงวิธีการเฉพาะสําหรับการดำเนินการเปลี่ยนแปลง insert, insertMany, upsert และ upsertMany แทนวิธีการ executeGraphql ทั่วไป

จัดการข้อมูลผู้ใช้ด้วยวิธีการ executeGraphql

กรณีการใช้งานทั่วไปของ Admin SDK คือการจัดการข้อมูลผู้ใช้

ใช้ข้อมูลเข้าสู่ระบบของผู้ดูแลระบบ

วิธีที่ตรงที่สุดคือการเข้าถึงข้อมูลผู้ใช้โดยใช้ข้อมูลเข้าสู่ระบบระดับผู้ดูแลระบบ

// User can be publicly accessible, or restricted to admins
const query = "query getProfile(id: AuthID) { user(id: $id) { id name } }";

interface UserData {
  user: {
    id: string;
    name: string;
  };
}

export interface UserVariables {
  id: string;
}

const options:GraphqlOptions<UserVariables> = { variables: { id: "QVBJcy5ndXJ1" } };

// executeGraphql
const gqlResponse = await dataConnect.executeGraphql<UserData, UserVariables>(query, options);

// executeGraphqlRead (similar to previous sample but only for read operations)
const gqlResponse = await dataConnect.executeGraphqlRead<UserData, UserVariables>(query, options);

// gqlResponse -> { "data": { "user": { "id": "QVBJcy5ndXJ1", "name": "Fred" } } }

ข้อมูลเข้าสู่ระบบที่ใช้ในการแอบอ้างเป็นผู้ใช้

นอกจากนี้ยังมี Use Case ที่คุณต้องการให้สคริปต์แก้ไขข้อมูลผู้ใช้ตามข้อมูลเข้าสู่ระบบแบบจํากัดในนามของผู้ใช้ที่เฉพาะเจาะจง แนวทางนี้เป็นไปตามหลักการให้สิทธิ์ขั้นต่ำที่สุด

หากต้องการใช้อินเทอร์เฟซนี้ ให้รวบรวมข้อมูลจากโทเค็นการตรวจสอบสิทธิ์ JWT ที่กําหนดเองซึ่งเป็นไปตามรูปแบบโทเค็น Authentication โปรดดูคู่มือโทเค็นที่กำหนดเองด้วย

// Get the current user's data
const queryGetUserImpersonation = `
    query getUser @auth(level: USER) {
        user(key: {uid_expr: "auth.uid"}) {
            id,
            name
        }
    }`;

// Impersonate a user with the specified auth claims
const optionsAuthenticated: GraphqlOptions<undefined> = {
    impersonate: {
        authClaims: {
            sub: 'QVBJcy5ndXJ1'
        }
    }
};

// executeGraphql with impersonated authenticated user scope
const gqlResponse = await dataConnect.executeGraphql<UserData, undefined>(queryGetUserImpersonation, optionsAuthenticated);

// gqlResponse -> { "data": { "user": { "id": "QVBJcy5ndXJ1", "name": "Fred" } } }

จัดการข้อมูลสาธารณะด้วยวิธีการ executeGraphql

คุณทํางานกับข้อมูลที่เข้าถึงได้แบบสาธารณะได้โดยใช้ SDK โดยแอบอ้างเป็นผู้ใช้ที่ยังไม่ผ่านการตรวจสอบสิทธิ์

// Query to get posts, with authentication level PUBLIC
const queryGetPostsImpersonation = `
    query getPosts @auth(level: PUBLIC) {
        posts {
          description
        }
    }`;

// Attempt to access data as an unauthenticated user
const optionsUnauthenticated: GraphqlOptions<undefined> = {
    impersonate: {
        unauthenticated: true
    }
};

// executeGraphql with impersonated unauthenticated user scope
const gqlResponse = await dataConnect.executeGraphql<UserData, undefined>(queryGetPostsImpersonation, optionsUnauthenticated);

ดำเนินการกับข้อมูลจำนวนมาก

Firebase ขอแนะนําให้ใช้ Admin SDK สําหรับการดําเนินการกับข้อมูลจํานวนมากในฐานข้อมูลเวอร์ชันที่ใช้งานจริง

SDK มีเมธอดต่อไปนี้สําหรับการทํางานกับข้อมูลจํานวนมาก แต่ละเมธอดจะสร้างและดำเนินการการดัดแปลง GraphQL จากอาร์กิวเมนต์ที่ระบุ


// Methods of the bulk operations API
// dc is a Data Connect admin instance from getDataConnect

const resp = await dc.insert("movie" /*table name*/, data[0]);
const resp = await dc.insertMany("movie" /*table name*/, data);
const resp = await dc.upsert("movie" /*table name*/, data[0]);
const resp = await dc.upsertMany("movie" /*table name*/, data);

หมายเหตุเกี่ยวกับประสิทธิภาพสําหรับการดําเนินการแบบกลุ่ม

คำขอแต่ละรายการที่ส่งไปยังแบ็กเอนด์จะทำให้เกิดการส่งข้อมูลไปกลับไปยัง Cloud SQL 1 ครั้ง ดังนั้นยิ่งคุณส่งข้อมูลเป็นกลุ่มมากเท่าใด อัตราการส่งข้อมูลก็จะยิ่งสูงขึ้นเท่านั้น

อย่างไรก็ตาม ยิ่งกลุ่มมีขนาดใหญ่ คำสั่ง SQL ที่สร้างขึ้นก็จะยิ่งยาวขึ้น เมื่อถึงขีดจำกัดความยาวของคำสั่ง SQL ของ PostgreSQL คุณจะได้รับข้อผิดพลาด

ในทางปฏิบัติ ให้ทดลองหาขนาดการประมวลผลกลุ่มที่เหมาะสมสำหรับภาระงานของคุณ

ขั้นตอนถัดไปคือ