Mit dem Admin SDK können Sie Realtime Database-Daten mit vollen Administratorrechten oder mit feiner abgestuften eingeschränkten Rechten lesen und schreiben. In diesem Dokument führen wir Sie durch das Hinzufügen des Firebase Admin SDK zu Ihrem Projekt für den Zugriff auf die Firebase Realtime Database.
Admin-SDK-Setup
Um mit der Firebase Realtime Database auf Ihrem Server zu beginnen, müssen Sie zunächst das Firebase Admin SDK in der Sprache Ihrer Wahl einrichten .
Admin-SDK-Authentifizierung
Bevor Sie mit dem Firebase Admin SDK von einem Server aus auf die Firebase-Echtzeitdatenbank zugreifen können, müssen Sie Ihren Server bei Firebase authentifizieren. Wenn Sie einen Server authentifizieren, anstatt sich mit den Anmeldeinformationen eines Benutzerkontos anzumelden, wie Sie es in einer Client-App tun würden, authentifizieren Sie sich mit einem Dienstkonto , das Ihren Server gegenüber Firebase identifiziert.
Sie können zwei verschiedene Zugriffsebenen erhalten, wenn Sie sich mit dem Firebase Admin SDK authentifizieren:
Firebase Admin SDK-Authentifizierungszugriffsebenen | |
---|---|
Administratorrechte | Vollständiger Lese- und Schreibzugriff auf die Echtzeitdatenbank eines Projekts. Verwenden Sie es mit Vorsicht, um Verwaltungsaufgaben wie Datenmigration oder -umstrukturierung durchzuführen, die uneingeschränkten Zugriff auf die Ressourcen Ihres Projekts erfordern. |
Begrenzte Privilegien | Zugriff auf die Echtzeitdatenbank eines Projekts, beschränkt auf die Ressourcen, die Ihr Server benötigt. Verwenden Sie diese Ebene, um administrative Aufgaben auszuführen, die klar definierte Zugriffsanforderungen haben. Wenn Sie beispielsweise einen Zusammenfassungsjob ausführen, der Daten über die gesamte Datenbank liest, können Sie sich vor versehentlichen Schreibvorgängen schützen, indem Sie eine schreibgeschützte Sicherheitsregel festlegen und dann das Admin SDK mit durch diese Regel eingeschränkten Berechtigungen initialisieren. |
Authentifizieren Sie sich mit Administratorrechten
Wenn Sie das Firebase Admin SDK mit den Anmeldeinformationen für ein Dienstkonto mit der Bearbeiterrolle in Ihrem Firebase-Projekt initialisieren, hat diese Instanz vollständigen Lese- und Schreibzugriff auf die Echtzeitdatenbank Ihres Projekts.
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())
Gehen
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)
Authentifizieren Sie sich mit eingeschränkten Rechten
Als bewährte Methode sollte ein Dienst nur Zugriff auf die Ressourcen haben, die er benötigt. Um eine genauere Kontrolle über die Ressourcen zu erhalten, auf die eine Firebase-App-Instanz zugreifen kann, verwenden Sie eine eindeutige Kennung in Ihren Sicherheitsregeln , um Ihren Dienst darzustellen. Richten Sie dann entsprechende Regeln ein, die Ihrem Dienst Zugriff auf die benötigten Ressourcen gewähren. Zum Beispiel:
{ "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'" } } }
Verwenden Sie dann auf Ihrem Server beim Initialisieren der Firebase-App die Option databaseAuthVariableOverride
, um das von Ihren Datenbankregeln verwendete auth
zu überschreiben. Legen Sie in diesem benutzerdefinierten auth
das uid
Feld auf die Kennung fest, die Sie verwendet haben, um Ihren Dienst in Ihren Sicherheitsregeln darzustellen.
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())
Gehen
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)
In einigen Fällen möchten Sie möglicherweise die Admin-SDKs herabsetzen, um als nicht authentifizierter Client zu fungieren. Sie können dies tun, indem Sie einen Wert von null
für die Überschreibung der Datenbank-Auth-Variable angeben.
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())
Gehen
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)