با استفاده از 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)
مراحل بعدی
- یاد بگیرید چگونه دادهها را برای Realtime Database ساختاردهی کنید.
- مقیاسبندی دادهها در چندین نمونه پایگاه داده .
- ذخیره دادهها.
- بازیابی دادهها.
- پایگاه داده خود را در کنسول Firebase مشاهده کنید.