หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

ข้อมูลเบื้องต้นเกี่ยวกับ Admin Database API

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

การตั้งค่า Admin SDK

ในการเริ่มต้นใช้งานฐานข้อมูลเรียลไทม์ Firebase บนเซิร์ฟเวอร์ของคุณก่อนอื่นคุณต้อง ตั้งค่า Firebase Admin SDK ในภาษาที่คุณเลือก

การตรวจสอบสิทธิ์ Admin SDK

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

คุณจะได้รับการเข้าถึงสองระดับที่แตกต่างกันเมื่อคุณตรวจสอบสิทธิ์โดยใช้ Firebase Admin SDK:

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

รับรองความถูกต้องด้วยสิทธิ์ของผู้ดูแลระบบ

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

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))
    .setDatabaseUrl("https://databaseName.firebaseio.com")
    // Or other region, e.g. <databaseName>.europe-west1.firebasedatabase.app
    .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) {
  }
});
โหนด 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),
  databaseURL: "https://databaseName.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())
ไป
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))
    .setDatabaseUrl("https://databaseName.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);
    }
});
โหนด 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),
  databaseURL: "https://databaseName.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())
ไป
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))
    .setDatabaseUrl("https://databaseName.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);
    }
});
โหนด 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),
  databaseURL: "https://databaseName.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())
ไป
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)

ขั้นตอนถัดไป