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