باستخدام Admin SDK ، يمكنك قراءة بيانات Realtime Database وكتابتها بامتيازات المسؤول الكاملة ، أو بامتيازات محدودة أدق. في هذا المستند ، سنوجهك خلال إضافة Firebase Admin SDK إلى مشروعك للوصول إلى قاعدة بيانات Firebase Realtime.
إعداد SDK للمسؤول
لبدء استخدام قاعدة بيانات Firebase Realtime على خادمك ، ستحتاج أولاً إلى إعداد Firebase Admin SDK باللغة التي تختارها.
مصادقة المشرف SDK
قبل أن تتمكن من الوصول إلى قاعدة بيانات Firebase Realtime من خادم باستخدام Firebase Admin SDK ، يجب عليك مصادقة خادمك باستخدام Firebase. عندما تقوم بمصادقة خادم ، بدلاً من تسجيل الدخول باستخدام بيانات اعتماد حساب المستخدم كما تفعل في تطبيق العميل ، فإنك تقوم بالمصادقة باستخدام حساب خدمة يحدد خادمك إلى Firebase.
يمكنك الحصول على مستويين مختلفين من الوصول عند المصادقة باستخدام Firebase Admin SDK:
مستويات الوصول إلى مصادقة SDK لمشرف Firebase | |
---|---|
الامتيازات الإدارية | أكمل حق الوصول للقراءة والكتابة إلى قاعدة بيانات Realtime للمشروع. استخدم بحذر لإكمال المهام الإدارية مثل ترحيل البيانات أو إعادة الهيكلة التي تتطلب وصولاً غير مقيد إلى موارد مشروعك. |
امتيازات محدودة | الوصول إلى Realtime Database للمشروع ، يقتصر على الموارد التي يحتاجها الخادم الخاص بك فقط. استخدم هذا المستوى لإكمال المهام الإدارية التي لها متطلبات وصول محددة جيدًا. على سبيل المثال ، عند تشغيل مهمة تلخيص تقرأ البيانات عبر قاعدة البيانات بأكملها ، يمكنك الحماية من الكتابة غير المقصودة عن طريق تعيين قاعدة أمان للقراءة فقط ثم تهيئة Admin SDK بامتيازات مقيدة بهذه القاعدة. |
المصادقة بامتيازات المسؤول
عند تهيئة Firebase Admin SDK باستخدام بيانات اعتماد حساب خدمة مع دور المحرر في مشروع Firebase ، يكون لهذا المثيل حق الوصول الكامل للقراءة والكتابة إلى قاعدة بيانات Realtime الخاصة بمشروعك.
جافا
// 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()); });
بايثون
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); } });
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()); });
بايثون
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
لتجاوز متغير المصادقة في قاعدة البيانات.
جافا
// 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()); });
بايثون
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)
الخطوات التالية
- تعرف على كيفية هيكلة البيانات لقاعدة بيانات Realtime.
- مقياس البيانات عبر طبعات قاعدة بيانات متعددة .
- حفظ البيانات.
- استرداد البيانات.
- اعرض قاعدة البيانات الخاصة بك في وحدة تحكم Firebase.