مقدمه ای بر SDK پایگاه داده مدیریت

با استفاده از Admin SDK، می‌توانید داده‌های پایگاه داده Realtime را با امتیازات کامل مدیر یا با امتیازات محدودتر بخوانید و بنویسید. در این سند، شما را در افزودن Firebase Admin SDK به پروژه‌تان برای دسترسی به Firebase Realtime Database راهنمایی خواهیم کرد.

تنظیمات SDK ادمین

برای شروع کار با پایگاه داده Firebase Realtime روی سرور خود، ابتدا باید Firebase Admin SDK را به زبان مورد نظر خود تنظیم کنید .

احراز هویت SDK ادمین

قبل از اینکه بتوانید با استفاده از Firebase Admin SDK از طریق یک سرور به Firebase Realtime Database دسترسی پیدا کنید، باید سرور خود را با Firebase احراز هویت کنید. هنگام احراز هویت یک سرور، به جای ورود با اعتبارنامه‌های حساب کاربری مانند آنچه در یک برنامه کلاینت انجام می‌دهید، با یک حساب سرویس که سرور شما را به Firebase معرفی می‌کند، احراز هویت می‌شوید.

هنگام تأیید اعتبار با استفاده از Firebase Admin SDK، می‌توانید دو سطح دسترسی مختلف داشته باشید:

سطوح دسترسی احراز هویت SDK ادمین فایربیس
امتیازات اداری دسترسی کامل خواندن و نوشتن به Realtime Database پروژه. برای انجام وظایف مدیریتی مانند انتقال داده‌ها یا بازسازی که نیاز به دسترسی نامحدود به منابع پروژه شما دارند، با احتیاط استفاده کنید.
امتیازات محدود دسترسی به Realtime Database یک پروژه، محدود به منابعی که سرور شما نیاز دارد. از این سطح برای انجام وظایف مدیریتی که الزامات دسترسی مشخصی دارند استفاده کنید. به عنوان مثال، هنگام اجرای یک کار خلاصه‌سازی که داده‌ها را در کل پایگاه داده می‌خواند، می‌توانید با تنظیم یک قانون امنیتی فقط خواندنی و سپس مقداردهی اولیه SDK مدیریت با امتیازات محدود شده توسط آن قانون، از نوشتن‌های تصادفی جلوگیری کنید.

با امتیازات مدیر تأیید اعتبار کنید

وقتی SDK مدیریت فایربیس را با اعتبارنامه‌های یک حساب کاربری سرویس با نقش ویرایشگر در پروژه فایربیس خود راه‌اندازی می‌کنید، آن نمونه دسترسی کامل خواندن و نوشتن به Realtime Database پروژه شما را دارد.

جاوا
// 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) {
  }
});
نود جی اس
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());
});
پایتون
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 را روی شناسه‌ای که برای نمایش سرویس خود در قوانین امنیتی خود استفاده کرده‌اید، تنظیم کنید.

جاوا
// 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);
    }
});
نود جی اس
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());
});
پایتون
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 برای متغیر auth پایگاه داده override انجام دهید.

جاوا
// 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);
    }
});
نود جی اس
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());
});
پایتون
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)

مراحل بعدی