คุณจะใช้ Admin SDK เพื่ออ่านและเขียนข้อมูล Realtime Database ด้วยสิทธิ์ของผู้ดูแลระบบโดยสมบูรณ์ หรือมีสิทธิ์แบบจำกัดที่ละเอียดขึ้น ในเอกสารนี้ เราจะแนะนำคุณเกี่ยวกับการเพิ่ม Firebase Admin SDK ไปยังโปรเจ็กต์สําหรับการเข้าถึงฐานข้อมูลเรียลไทม์ของ Firebase
การตั้งค่า Admin SDK
หากต้องการเริ่มต้นใช้งานฐานข้อมูลเรียลไทม์ของ Firebase บนเซิร์ฟเวอร์ คุณจะต้อง คุณต้องตั้งค่า Firebase Admin SDK ในภาษาที่คุณต้องการ
การตรวจสอบสิทธิ์ SDK ผู้ดูแลระบบ
ก่อนที่จะเข้าถึงฐานข้อมูลเรียลไทม์ของ Firebase จากเซิร์ฟเวอร์โดยใช้ Firebase Admin SDK ได้ คุณต้อง ตรวจสอบสิทธิ์เซิร์ฟเวอร์ของคุณด้วย Firebase เมื่อคุณตรวจสอบสิทธิ์เซิร์ฟเวอร์ แทนที่จะลงชื่อเข้าใช้ด้วย ข้อมูลเข้าสู่ระบบของบัญชีผู้ใช้เหมือนที่คุณทำในแอปไคลเอ็นต์ คุณจะตรวจสอบสิทธิ์ด้วย บัญชีบริการ ซึ่งระบุเซิร์ฟเวอร์ของคุณไปยัง Firebase
คุณจะได้รับสิทธิ์การเข้าถึง 2 ระดับเมื่อตรวจสอบสิทธิ์โดยใช้ Firebase Admin SDK
ระดับการเข้าถึงการตรวจสอบสิทธิ์ Firebase Admin SDK | |
---|---|
สิทธิ์ของผู้ดูแลระบบ | มีสิทธิ์เข้าถึงในการอ่านและเขียน Realtime Database ของโปรเจ็กต์โดยสมบูรณ์ ใช้กับ ใช้ความระมัดระวังในการทำงานด้านการดูแลระบบ เช่น การย้ายข้อมูลหรือการปรับโครงสร้าง ต้องการสิทธิ์เข้าถึงทรัพยากรของโปรเจ็กต์แบบไม่จำกัด |
สิทธิ์ที่จำกัด | สิทธิ์เข้าถึง Realtime Database ของโปรเจ็กต์ จำกัดเฉพาะทรัพยากรที่ ที่เซิร์ฟเวอร์ต้องการ ใช้ระดับนี้เพื่อทำงานด้านการดูแลระบบที่มีการกำหนดเอาไว้เป็นอย่างดี ข้อกำหนดในการเข้าถึง ตัวอย่างเช่น เมื่อเรียกใช้งานการสรุปที่อ่านข้อมูลทั่วทั้ง ฐานข้อมูลทั้งหมด คุณสามารถป้องกันการเขียนโดยไม่ตั้งใจได้ด้วยการตั้งค่าแบบอ่านอย่างเดียว กฎความปลอดภัยแล้วเริ่มต้น Admin SDK ด้วยสิทธิ์ที่จำกัด ตามกฎนั้น |
ตรวจสอบสิทธิ์ด้วยสิทธิ์ของผู้ดูแลระบบ
เมื่อคุณเริ่มต้น Firebase Admin SDK ด้วยข้อมูลเข้าสู่ระบบสำหรับบริการ บัญชีที่มีบทบาทผู้แก้ไขในโปรเจ็กต์ Firebase ของคุณ อินสแตนซ์นั้นจะ มีสิทธิ์เข้าถึงในการอ่านและเขียน Realtime Database ของโปรเจ็กต์โดยสมบูรณ์
Java
// Fetch the service account key JSON file contents FileInputStream serviceAccount = new FileInputStream("path/to/serviceAccount.json"); // Initialize the app with a service account, granting admin privileges FirebaseOptions options = FirebaseOptions.builder() .setCredentials(GoogleCredentials.fromStream(serviceAccount)) // The database URL depends on the location of the database .setDatabaseUrl("https://DATABASE_NAME.firebaseio.com") .build(); FirebaseApp.initializeApp(options); // As an admin, the app has access to read and write all data, regardless of Security Rules DatabaseReference ref = FirebaseDatabase.getInstance() .getReference("restricted_access/secret_document"); ref.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { Object document = dataSnapshot.getValue(); System.out.println(document); } @Override public void onCancelled(DatabaseError error) { } });
Node.js
var admin = require("firebase-admin"); // Fetch the service account key JSON file contents var serviceAccount = require("path/to/serviceAccountKey.json"); // Initialize the app with a service account, granting admin privileges admin.initializeApp({ credential: admin.credential.cert(serviceAccount), // The database URL depends on the location of the database databaseURL: "https://DATABASE_NAME.firebaseio.com" }); // As an admin, the app has access to read and write all data, regardless of Security Rules var db = admin.database(); var ref = db.ref("restricted_access/secret_document"); ref.once("value", function(snapshot) { console.log(snapshot.val()); });
Python
import firebase_admin from firebase_admin import credentials from firebase_admin import db # Fetch the service account key JSON file contents cred = credentials.Certificate('path/to/serviceAccountKey.json') # Initialize the app with a service account, granting admin privileges firebase_admin.initialize_app(cred, { 'databaseURL': 'https://databaseName.firebaseio.com' }) # As an admin, the app has access to read and write all data, regradless of Security Rules ref = db.reference('restricted_access/secret_document') print(ref.get())
Go
ctx := context.Background() conf := &firebase.Config{ DatabaseURL: "https://databaseName.firebaseio.com", } // Fetch the service account key JSON file contents opt := option.WithCredentialsFile("path/to/serviceAccountKey.json") // Initialize the app with a service account, granting admin privileges app, err := firebase.NewApp(ctx, conf, opt) if err != nil { log.Fatalln("Error initializing app:", err) } client, err := app.Database(ctx) if err != nil { log.Fatalln("Error initializing database client:", err) } // As an admin, the app has access to read and write all data, regradless of Security Rules ref := client.NewRef("restricted_access/secret_document") var data map[string]interface{} if err := ref.Get(ctx, &data); err != nil { log.Fatalln("Error reading from database:", err) } fmt.Println(data)
ตรวจสอบสิทธิ์แบบจำกัด
แนวทางปฏิบัติแนะนำคือบริการควรมีสิทธิ์เข้าถึงเฉพาะทรัพยากรที่ต้องการเท่านั้น โดยวิธีการมีดังนี้ การควบคุมทรัพยากรที่อินสแตนซ์ของแอป Firebase ทำได้โดยละเอียดยิ่งขึ้น ให้ใช้ตัวระบุที่ไม่ซ้ำกันในกฎความปลอดภัย เพื่อแสดงถึงบริการของคุณ จากนั้นตั้งค่ากฎที่เหมาะสมซึ่งให้สิทธิ์เข้าถึงบริการของคุณ ทรัพยากรต่างๆ ที่จำเป็น เช่น
{ "rules": { "public_resource": { ".read": true, ".write": true }, "some_resource": { ".read": "auth.uid === 'my-service-worker'", ".write": false }, "another_resource": { ".read": "auth.uid === 'my-service-worker'", ".write": "auth.uid === 'my-service-worker'" } } }
จากนั้นเมื่อเริ่มแอป Firebase บนเซิร์ฟเวอร์ ให้ใช้
databaseAuthVariableOverride
เพื่อลบล้างออบเจ็กต์ auth
ที่ใช้โดย
กฎฐานข้อมูลของคุณ ในออบเจ็กต์ auth
ที่กำหนดเองนี้ ให้ตั้งค่าช่อง uid
เป็น
ที่ใช้แสดงบริการของคุณในกฎความปลอดภัย
Java
// Fetch the service account key JSON file contents FileInputStream serviceAccount = new FileInputStream("path/to/serviceAccountCredentials.json"); // Initialize the app with a custom auth variable, limiting the server's access Map<String, Object> auth = new HashMap<String, Object>(); auth.put("uid", "my-service-worker"); FirebaseOptions options = new FirebaseOptions.Builder() .setCredential(FirebaseCredentials.fromCertificate(serviceAccount)) // The database URL depends on the location of the database .setDatabaseUrl("https://DATABASE_NAME.firebaseio.com") .setDatabaseAuthVariableOverride(auth) .build(); FirebaseApp.initializeApp(options); // The app only has access as defined in the Security Rules DatabaseReference ref = FirebaseDatabase .getInstance() .getReference("/some_resource"); ref.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { String res = dataSnapshot.getValue(); System.out.println(res); } });
Node.js
var admin = require("firebase-admin"); // Fetch the service account key JSON file contents var serviceAccount = require("path/to/serviceAccountKey.json"); // Initialize the app with a custom auth variable, limiting the server's access admin.initializeApp({ credential: admin.credential.cert(serviceAccount), // The database URL depends on the location of the database databaseURL: "https://DATABASE_NAME.firebaseio.com", databaseAuthVariableOverride: { uid: "my-service-worker" } }); // The app only has access as defined in the Security Rules var db = admin.database(); var ref = db.ref("/some_resource"); ref.once("value", function(snapshot) { console.log(snapshot.val()); });
Python
import firebase_admin from firebase_admin import credentials from firebase_admin import db # Fetch the service account key JSON file contents cred = credentials.Certificate('path/to/serviceAccountKey.json') # Initialize the app with a custom auth variable, limiting the server's access firebase_admin.initialize_app(cred, { 'databaseURL': 'https://databaseName.firebaseio.com', 'databaseAuthVariableOverride': { 'uid': 'my-service-worker' } }) # The app only has access as defined in the Security Rules ref = db.reference('/some_resource') print(ref.get())
Go
ctx := context.Background() // Initialize the app with a custom auth variable, limiting the server's access ao := map[string]interface{}{"uid": "my-service-worker"} conf := &firebase.Config{ DatabaseURL: "https://databaseName.firebaseio.com", AuthOverride: &ao, } // Fetch the service account key JSON file contents opt := option.WithCredentialsFile("path/to/serviceAccountKey.json") app, err := firebase.NewApp(ctx, conf, opt) if err != nil { log.Fatalln("Error initializing app:", err) } client, err := app.Database(ctx) if err != nil { log.Fatalln("Error initializing database client:", err) } // The app only has access as defined in the Security Rules ref := client.NewRef("/some_resource") var data map[string]interface{} if err := ref.Get(ctx, &data); err != nil { log.Fatalln("Error reading from database:", err) } fmt.Println(data)
ในบางกรณี คุณอาจต้องการจำกัดขอบเขต SDK ของผู้ดูแลระบบเพื่อทำหน้าที่เป็น
ไคลเอ็นต์ที่ไม่ผ่านการตรวจสอบสิทธิ์ ซึ่งทำได้โดยระบุค่า
null
สำหรับการลบล้างตัวแปรการตรวจสอบสิทธิ์ฐานข้อมูล
Java
// Fetch the service account key JSON file contents FileInputStream serviceAccount = new FileInputStream("path/to/serviceAccountCredentials.json"); FirebaseOptions options = new FirebaseOptions.Builder() .setCredential(FirebaseCredentials.fromCertificate(serviceAccount)) // The database URL depends on the location of the database .setDatabaseUrl("https://DATABASE_NAME.firebaseio.com") .setDatabaseAuthVariableOverride(null) .build(); FirebaseApp.initializeApp(options); // The app only has access to public data as defined in the Security Rules DatabaseReference ref = FirebaseDatabase .getInstance() .getReference("/public_resource"); ref.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { String res = dataSnapshot.getValue(); System.out.println(res); } });
Node.js
var admin = require("firebase-admin"); // Fetch the service account key JSON file contents var serviceAccount = require("path/to/serviceAccountKey.json"); // Initialize the app with a null auth variable, limiting the server's access admin.initializeApp({ credential: admin.credential.cert(serviceAccount), // The database URL depends on the location of the database databaseURL: "https://DATABASE_NAME.firebaseio.com", databaseAuthVariableOverride: null }); // The app only has access to public data as defined in the Security Rules var db = admin.database(); var ref = db.ref("/public_resource"); ref.once("value", function(snapshot) { console.log(snapshot.val()); });
Python
import firebase_admin from firebase_admin import credentials from firebase_admin import db # Fetch the service account key JSON file contents cred = credentials.Certificate('path/to/serviceAccountKey.json') # Initialize the app with a None auth variable, limiting the server's access firebase_admin.initialize_app(cred, { 'databaseURL': 'https://databaseName.firebaseio.com', 'databaseAuthVariableOverride': None }) # The app only has access to public data as defined in the Security Rules ref = db.reference('/public_resource') print(ref.get())
Go
ctx := context.Background() // Initialize the app with a nil auth variable, limiting the server's access var nilMap map[string]interface{} conf := &firebase.Config{ DatabaseURL: "https://databaseName.firebaseio.com", AuthOverride: &nilMap, } // Fetch the service account key JSON file contents opt := option.WithCredentialsFile("path/to/serviceAccountKey.json") app, err := firebase.NewApp(ctx, conf, opt) if err != nil { log.Fatalln("Error initializing app:", err) } client, err := app.Database(ctx) if err != nil { log.Fatalln("Error initializing database client:", err) } // The app only has access to public data as defined in the Security Rules ref := client.NewRef("/some_resource") var data map[string]interface{} if err := ref.Get(ctx, &data); err != nil { log.Fatalln("Error reading from database:", err) } fmt.Println(data)
ขั้นตอนถัดไป
- ดูวิธีจัดโครงสร้างข้อมูลสำหรับ Realtime Database
- ปรับขนาดข้อมูลในอินสแตนซ์ฐานข้อมูลหลายรายการ
- บันทึกข้อมูล
- ดึงข้อมูล
- ดูฐานข้อมูลของคุณใน คอนโซล Firebase