با Admin SDK، میتوانید دادههای پایگاه داده بیدرنگ را با امتیازات کامل سرپرست، یا با امتیازات محدود دقیقتر بخوانید و بنویسید. در این سند، ما شما را از طریق افزودن Firebase Admin SDK به پروژه خود برای دسترسی به Firebase Realtime Database راهنمایی می کنیم.
راه اندازی SDK مدیریت
برای شروع کار با پایگاه داده بیدرنگ Firebase در سرور خود، ابتدا باید Firebase Admin SDK را به زبان انتخابی خود تنظیم کنید .
احراز هویت SDK Admin
قبل از اینکه بتوانید از سروری با استفاده از Firebase Admin SDK Firebase Realtime Database دسترسی پیدا کنید، باید سرور خود را با Firebase احراز هویت کنید. هنگامی که یک سرور را احراز هویت میکنید، به جای اینکه مانند یک برنامه مشتری، با اعتبار حساب کاربری وارد شوید، با یک حساب سرویس که سرور شما را به Firebase شناسایی میکند، احراز هویت میکنید.
هنگام احراز هویت با استفاده از Firebase Admin SDK می توانید دو سطح مختلف دسترسی داشته باشید:
Firebase Admin SDK Auth Levels Access | |
---|---|
امتیازات اداری | دسترسی کامل خواندن و نوشتن به Realtime Database پروژه. برای تکمیل کارهای اداری مانند انتقال داده یا بازسازی که نیاز به دسترسی نامحدود به منابع پروژه شما دارند، با احتیاط از آن استفاده کنید. |
امتیازات محدود | دسترسی به Realtime Database پروژه، تنها به منابعی که سرور شما نیاز دارد محدود می شود. از این سطح برای تکمیل وظایف اداری که الزامات دسترسی به خوبی تعریف شده دارند استفاده کنید. برای مثال، هنگام اجرای یک کار خلاصهسازی که دادهها را در کل پایگاه داده میخواند، میتوانید با تنظیم یک قانون امنیتی فقط خواندنی و سپس مقداردهی اولیه Admin SDK با امتیازات محدود شده توسط آن قانون، از نوشتن تصادفی محافظت کنید. |
احراز هویت با امتیازات مدیریت
هنگامی که Firebase Admin SDK را با اعتبار یک حساب سرویس با نقش ویرایشگر در پروژه Firebase خود راه اندازی می کنید، آن نمونه دسترسی خواندن و نوشتن کامل به 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) { } });
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
برای بازنویسی متغیر auth پایگاه داده انجام دهید.
جاوا
// 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 Database را بیاموزید.
- مقیاس داده ها در چندین نمونه پایگاه داده .
- ذخیره داده ها
- بازیابی داده ها
- پایگاه داده خود را در کنسول Firebase مشاهده کنید.