Firebase Data Connect SDK ของผู้ดูแลระบบช่วยให้คุณเรียกการค้นหาและการเปลี่ยนแปลงจาก สภาพแวดล้อมที่เชื่อถือได้ เช่น Cloud Functions, Backend ที่กำหนดเอง หรือเวิร์กสเตชันของคุณเอง คุณสามารถสร้าง Admin SDK ที่กำหนดเองควบคู่ไปกับการออกแบบสคีมา การค้นหา และการเปลี่ยนแปลงที่คุณนําไปใช้กับData Connectบริการได้ในลักษณะเดียวกับการสร้าง SDK สําหรับแอปไคลเอ็นต์ จากนั้นผสานรวม เมธอดจาก SDK นี้เข้ากับตรรกะแบ็กเอนด์หรือสคริปต์การดูแลระบบ
ดังที่เราได้กล่าวไว้ในที่อื่นๆ โปรดทราบว่าไคลเอ็นต์จะไม่ส่งData Connectการค้นหา และการเปลี่ยนแปลงในเวลาที่ส่งคำขอ แต่เมื่อมีการใช้งาน ระบบจะจัดเก็บการดำเนินการ Data Connect ไว้ในเซิร์ฟเวอร์ เช่น Cloud Functions ซึ่งหมายความว่าทุกครั้งที่คุณนําการเปลี่ยนแปลงไปใช้กับคําค้นหาและการเปลี่ยนแปลง คุณจะต้องสร้าง Admin SDK ใหม่และนําบริการที่ขึ้นอยู่กับ Admin SDK เหล่านั้นไปใช้ใหม่ด้วย
ก่อนเริ่มต้น
- ดูข้อมูลเกี่ยวกับการออกแบบสคีมา Data Connect คิวรี และการเปลี่ยนแปลง ในเวิร์กโฟลว์ทั่วไป คุณจะพัฒนาฟังก์ชันเหล่านี้ควบคู่ไปกับโค้ดแอปพลิเคชัน รวมถึงบริการที่ใช้ Admin SDK
- ติดตั้ง Firebase CLI
- รวม Admin SDK สำหรับ Node.js เป็นทรัพยากร Dependency ทุกที่ที่คุณวางแผนจะเรียกใช้ Admin SDK ที่สร้างขึ้น
สร้าง Admin SDK
หลังจากสร้างData Connectสคีมา การค้นหา และการเปลี่ยนแปลงแล้ว คุณจะ สร้าง Admin SDK ที่เกี่ยวข้องได้โดยทำดังนี้
เปิดหรือสร้างไฟล์
connector.yamlแล้วเพิ่มคำจำกัดความadminNodeSdkconnectorId: default generate: adminNodeSdk: outputDir: ../../dataconnect-generated/admin-generated package: "@dataconnect/admin-generated" packageJsonDir: ../..โดยปกติแล้ว
connector.yamlจะอยู่ในไดเรกทอรีเดียวกับไฟล์ GraphQL (.gql) ที่มีคำจำกัดความของการค้นหาและการเปลี่ยนแปลง หากคุณสร้าง SDK ของไคลเอ็นต์แล้ว ระบบจะสร้างไฟล์นี้ให้โดยอัตโนมัติสร้าง 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) การดำเนินการนี้จะช่วยให้มั่นใจได้ว่าเฉพาะผู้ที่โทรในระดับผู้ดูแลระบบเท่านั้นที่จะดำเนินการเหล่านี้ได้