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

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

เมื่อคุณแอบอ้างเป็นผู้ใช้ การดำเนินการจะสำเร็จก็ต่อเมื่อข้อมูลผู้ใช้ที่คุณระบุผ่านการตรวจสอบสิทธิ์ที่ระบุไว้ในคำจำกัดความ 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) การดำเนินการนี้จะช่วยให้มั่นใจได้ว่าเฉพาะผู้ที่โทรในระดับผู้ดูแลระบบเท่านั้นที่จะดำเนินการเหล่านี้ได้