مقدمة عن Admin Database API

باستخدام SDK للمشرف، يمكنك قراءة بيانات قاعدة بيانات الوقت الفعلي وكتابتها باستخدام امتيازات المشرف الكاملة، أو باستخدام امتيازات محدودة ودقيقة. في هذا المستند، سنرشدك خلال إضافة SDK لمشرف Firebase إلى مشروعك للوصول إلى قاعدة بيانات Firebase في الوقت الفعلي.

إعداد SDK للمشرف

لبدء استخدام "قاعدة بيانات Firebase في الوقت الفعلي" على خادمك، ستحتاج أولاً إلى إعداد حزمة تطوير البرامج (SDK) لمشرف Firebase باللغة التي تختارها.

مصادقة SDK للمشرف

قبل أن تتمكّن من الوصول إلى "قاعدة بيانات Firebase في الوقت الفعلي" من خادم يستخدم حزمة تطوير البرامج (SDK) لمشرف Firebase، عليك مصادقة خادمك مع Firebase. عند مصادقة خادم، بدلاً من تسجيل الدخول باستخدام بيانات اعتماد حساب مستخدم، كما هو الحال في تطبيق العميل، يمكنك المصادقة باستخدام حساب الخدمة الذي يحدّد خادمك مع Firebase.

يمكنك الحصول على مستويَين مختلفَين من الوصول عند المصادقة باستخدام حزمة تطوير البرامج (SDK) لمشرف Firebase:

مستويات الوصول إلى مصادقة حزمة تطوير البرامج (SDK) لمشرف Firebase
امتيازات المشرف إكمال حق الوصول للقراءة والكتابة إلى قاعدة بيانات الوقت الفعلي للمشروع. يُرجى توخي الحذر لإكمال المهام الإدارية التي تتطلب الوصول غير المشروط إلى موارد مشروعك، مثل نقل البيانات أو إعادة الهيكلة.
امتيازات محدودة إمكانية الوصول إلى قاعدة بيانات المشروع في الوقت الفعلي، ويقتصر ذلك على الموارد التي يحتاجها خادمك فقط استخدِم هذا المستوى لإكمال المهام الإدارية التي تتضمّن متطلبات وصول محددة جيدًا. على سبيل المثال، عند تنفيذ مهمة تلخيصية تقرأ البيانات في قاعدة البيانات بالكامل، يمكنك توفير الحماية من عمليات الكتابة غير المقصودة من خلال ضبط قاعدة أمان للقراءة فقط ثم إعداد حزمة تطوير البرامج (SDK) للمشرف مع منح امتيازات محدودة وفقًا لتلك القاعدة.

المصادقة باستخدام امتيازات المشرف

عند إعداد حزمة تطوير البرامج (SDK) لمشرف Firebase باستخدام بيانات الاعتماد لحساب خدمة بدور المحرِّر في مشروع 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))
    // 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)

الخطوات التالية