ใช้ Admin SDK ที่สร้างขึ้น

ผู้ดูแลระบบ Firebase Data Connect SDK ช่วยให้คุณเรียกใช้การค้นหาและการเปลี่ยนแปลงจาก สภาพแวดล้อมที่เชื่อถือได้ เช่น Cloud Functions, แบ็กเอนด์ที่กำหนดเอง หรือเวิร์กสเตชันของคุณเอง ในลักษณะเดียวกับการสร้าง SDK สำหรับแอปไคลเอ็นต์ คุณ สามารถสร้าง Admin SDK ที่กำหนดเองควบคู่ไปกับการออกแบบสคีมา การค้นหา และการเปลี่ยนแปลงที่คุณนําไปใช้กับบริการ Data Connect จากนั้นผสานรวม เมธอดจาก SDK นี้เข้ากับตรรกะแบ็กเอนด์หรือสคริปต์การดูแลระบบ

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

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

สร้าง Admin SDK

หลังจากสร้างสคีมา การค้นหา และการเปลี่ยนแปลง Data Connect แล้ว คุณจะ สร้าง Admin SDK ที่เกี่ยวข้องได้โดยทำดังนี้

  1. เปิดหรือสร้างไฟล์ connector.yaml แล้วเพิ่มคำจำกัดความ adminNodeSdk

    connectorId: default
    generate:
      adminNodeSdk:
        outputDir: ../../dataconnect-generated/admin-generated
        package: "@dataconnect/admin-generated"
        packageJsonDir: ../..
    

    โดยปกติแล้วจะพบไฟล์ connector.yaml ในไดเรกทอรีเดียวกับไฟล์ GraphQL (.gql) ที่มีคำจำกัดความของการค้นหาและการเปลี่ยนแปลง หากคุณสร้าง SDK ของไคลเอ็นต์แล้ว ระบบจะสร้างไฟล์นี้ให้โดยอัตโนมัติ

  2. สร้าง SDK

    หากคุณติดตั้งส่วนขยาย Data Connect VS Code ไว้ ระบบจะอัปเดต SDK ที่สร้างขึ้นให้เป็นเวอร์ชันล่าสุดอยู่เสมอ

    หรือใช้ Firebase CLI โดยทำดังนี้

    firebase dataconnect:sdk:generate

    หรือหากต้องการสร้าง SDK ใหม่โดยอัตโนมัติเมื่ออัปเดตไฟล์ gql ให้ทำดังนี้

    firebase dataconnect:sdk:generate --watch

ดำเนินการจาก Admin SDK

Admin SDK ที่สร้างขึ้นจะมีอินเทอร์เฟซและฟังก์ชันที่สอดคล้องกับ คำจำกัดความของgql ซึ่งคุณสามารถใช้เพื่อดำเนินการกับ ฐานข้อมูลได้ เช่น สมมติว่าคุณสร้าง SDK สำหรับฐานข้อมูลเพลง พร้อมกับคำค้นหา getSongs

import { initializeApp } from "firebase-admin/app";
import { getSongs } from "@dataconnect/admin-generated";

const adminApp = initializeApp();

const songs = await getSongs(
  { limit: 4 },
  { impersonate: { unauthenticated: true } }
);

หรือหากต้องการระบุการกำหนดค่าตัวเชื่อมต่อ ให้ทำดังนี้

import { initializeApp } from "firebase-admin/app";
import { getDataConnect } from "firebase-admin/data-connect";
import {
  connectorConfig,
  getSongs,
} from "@dataconnect/admin-generated";

const adminApp = initializeApp();
const adminDc = getDataConnect(connectorConfig);

const songs = await getSongs(
  adminDc,
  { limit: 4 },
  { impersonate: { unauthenticated: true } }
);

การสวมบทบาทเป็นผู้ใช้ที่ไม่ได้รับการตรวจสอบสิทธิ์

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

เมื่อเรียกใช้การดำเนินการสาธารณะด้วย Admin SDK คุณควรหลีกเลี่ยงการเรียกใช้ การดำเนินการที่มีสิทธิ์ของผู้ดูแลระบบแบบเต็ม (ตามหลักการของสิทธิ์ขั้นต่ำที่สุด) แต่คุณควรเรียกใช้การดำเนินการในฐานะผู้ใช้ที่เลียนแบบ (ดูส่วนถัดไป) หรือในฐานะผู้ใช้ที่ไม่ได้รับการตรวจสอบสิทธิ์ที่เลียนแบบ ผู้ใช้ที่ไม่ได้รับการตรวจสอบสิทธิ์จะเรียกใช้ได้เฉพาะการดำเนินการที่ทำเครื่องหมายเป็น PUBLIC เท่านั้น

ในตัวอย่างด้านบน ระบบจะเรียกใช้คำค้นหา getSongs ในฐานะผู้ใช้ที่ไม่ได้รับการตรวจสอบสิทธิ์

การแอบอ้างเป็นผู้ใช้

นอกจากนี้ คุณยังดำเนินการในนามของผู้ใช้ที่เฉพาะเจาะจงได้โดยส่งโทเค็น Firebase Authentication บางส่วนหรือทั้งหมดในตัวเลือก impersonate โดยคุณต้องระบุรหัสผู้ใช้ของผู้ใช้ในอ้างอิงย่อยเป็นอย่างน้อย (ค่านี้เหมือนกับauth.uidค่าเซิร์ฟเวอร์ ที่คุณอ้างอิงได้ในการดำเนินการ GraphQL ของ Data Connect)

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

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

เมื่อใช้ Cloud Functions ที่เรียกใช้ได้ ระบบจะ ยืนยันโทเค็นการตรวจสอบสิทธิ์โดยอัตโนมัติ และคุณจะใช้โทเค็นได้ดังตัวอย่างต่อไปนี้

import { HttpsError, onCall } from "firebase-functions/https";

export const callableExample = onCall(async (req) => {
    const authClaims = req.auth?.token;
    if (!authClaims) {
        throw new HttpsError("unauthenticated", "Unauthorized");
    }

    const favoriteSongs = await getMyFavoriteSongs(
        undefined,
        { impersonate: { authClaims } }
    );

    // ...
});

หรือใช้เมธอด Admin SDKverifyIdToken เพื่อตรวจสอบและถอดรหัส โทเค็นการตรวจสอบสิทธิ์ ตัวอย่างเช่น สมมติว่าคุณได้ติดตั้งใช้งานปลายทางเป็นฟังก์ชัน HTTP ธรรมดา และส่งโทเค็น Firebase Authentication ไปยังปลายทางโดยใช้ส่วนหัว authorization ตามมาตรฐาน

import { getAuth } from "firebase-admin/auth";
import { onRequest } from "firebase-functions/https";

const auth = getAuth();

export const httpExample = onRequest(async (req, res) => {
    const token = req.header("authorization")?.replace(/^bearer\s+/i, "");
    if (!token) {
        res.sendStatus(401);
        return;
    }
    let authClaims;
    try {
        authClaims = await auth.verifyIdToken(token);
    } catch {
        res.sendStatus(401);
        return;
    }

    const favoriteSongs = await getMyFavoriteSongs(
        undefined,
        { impersonate: { authClaims } }
    );

    // ...
});

คุณควรระบุ User ID ที่ไม่ได้มาจากแหล่งที่มาที่ตรวจสอบได้เฉพาะเมื่อทำภารกิจการดูแลระบบจริง เช่น การย้ายข้อมูล จากสภาพแวดล้อมที่ปลอดภัยและเข้าถึงแบบสาธารณะไม่ได้

// Never do this if end users can initiate execution of the code!
const favoriteSongs = await getMyFavoriteSongs(
  undefined,
  { impersonate: { authClaims } }
);

การเรียกใช้ด้วยสิทธิ์เข้าถึงแบบไม่จำกัด

หากคุณดำเนินการที่ต้องใช้สิทธิ์ระดับผู้ดูแลระบบ ให้นำพารามิเตอร์ การแอบอ้างออกจากคำสั่งเรียก

await upsertSong(adminDc, {
  title: songTitle_one,
  instrumentsUsed: [Instrument.VOCAL],
});

การดำเนินการที่เรียกในลักษณะนี้จะมีสิทธิ์เข้าถึงฐานข้อมูลโดยสมบูรณ์ หากคุณมีคำค้นหาหรือการเปลี่ยนแปลงที่มีไว้เพื่อใช้เพื่อวัตถุประสงค์ในการดูแลระบบเท่านั้น คุณควรระบุคำค้นหาหรือการเปลี่ยนแปลงเหล่านั้นด้วยคำสั่ง @auth(level: NO_ACCESS) การดำเนินการนี้จะช่วยให้มั่นใจได้ว่าเฉพาะผู้ที่โทรในระดับผู้ดูแลระบบเท่านั้นที่จะดำเนินการเหล่านี้ได้