Mit dem Admin SDK können Sie Realtime Database-Daten mit vollständigen Administratorberechtigungen oder mit detaillierteren eingeschränkten Berechtigungen lesen und schreiben. In diesem Dokument erfahren Sie, wie Sie das Firebase Admin SDK in Ihr Projekt einfügen, um auf die Firebase Realtime Database zuzugreifen.
Admin SDK einrichten
Wenn Sie die Firebase Realtime Database auf Ihrem Server verwenden möchten, müssen Sie zuerst das Firebase Admin SDK in der gewünschten Sprache einrichten.
Admin SDK-Authentifizierung
Bevor Sie mit dem Firebase Admin SDK von einem Server aus auf die Firebase Realtime Database zugreifen können, müssen Sie Ihren Server bei Firebase authentifizieren. Wenn Sie einen Server authentifizieren, melden Sie sich nicht mit den Anmeldedaten eines Nutzerkontos an, wie Sie es in einer Client-App tun würden, sondern Sie authentifizieren sich mit einem Dienstkonto, das Ihren Server bei Firebase identifiziert.
Wenn Sie sich mit dem Firebase Admin SDK authentifizieren, können Sie zwei verschiedene Zugriffsebenen erhalten:
| Firebase Admin SDK-Autorisierungsebenen | |
|---|---|
| Administratorberechtigungen | Vollständiger Lese- und Schreibzugriff auf die Realtime Database eines Projekts. Mit Vorsicht verwenden, um administrative Aufgaben wie Datenmigration oder ‑umstrukturierung auszuführen, die uneingeschränkten Zugriff auf die Ressourcen Ihres Projekts erfordern. |
| Eingeschränkte Berechtigungen | Zugriff auf die Realtime Database eines Projekts, beschränkt auf die Ressourcen, die Ihr Server benötigt. Verwenden Sie diese Ebene, um administrative Aufgaben mit genau definierten Zugriffsanforderungen auszuführen. Wenn Sie beispielsweise einen Zusammenfassungsjob ausführen, bei dem Daten aus der gesamten Datenbank gelesen werden, können Sie sich vor versehentlichen Schreibvorgängen schützen, indem Sie eine schreibgeschützte Sicherheitsregel festlegen und das Admin SDK dann mit Berechtigungen initialisieren, die durch diese Regel eingeschränkt werden. |
Authentifizierung mit Administratorberechtigungen
Wenn Sie das Firebase Admin SDK mit den Anmeldedaten für ein Dienstkonto mit der Rolle Editor für Ihr Firebase-Projekt initialisieren, hat diese Instanz vollständigen Lese- und Schreibzugriff auf die Realtime Database Ihres Projekts.
Java
// Initialize the SDK with Application Default Credentials FirebaseOptions options = FirebaseOptions.builder() .setCredentials(GoogleCredentials.getApplicationDefault()) // 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
import { initializeApp } from 'firebase-admin/app'; import { getDatabase } from 'firebase-admin/database'; // Initialize the app with Application Default Credentials, granting admin privileges initializeApp({ // 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 const db = getDatabase(); const ref = db.ref("restricted_access/secret_document"); ref.once("value", (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())
Go
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)
Authentifizierung mit eingeschränkten Berechtigungen
Als Best Practice sollte ein Dienst nur Zugriff auf die Ressourcen haben, die er benötigt. Wenn Sie eine detailliertere Kontrolle über die Ressourcen benötigen, 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. 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'"
}
}
}
Wenn Sie dann auf Ihrem Server die Firebase-App initialisieren, verwenden Sie die Option databaseAuthVariableOverride, um das von Ihren Datenbankregeln verwendete auth-Objekt zu überschreiben. Legen Sie in diesem benutzerdefinierten auth-Objekt das Feld uid auf die Kennung fest, die Sie zur Darstellung Ihres Dienstes in Ihren Sicherheitsregeln verwendet haben.
Java
// 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 = FirebaseOptions.builder() .setCredentials(GoogleCredentials.getApplicationDefault()) // 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
import { initializeApp } from 'firebase-admin/app'; import { getDatabase } from 'firebase-admin/database'; // Initialize the app with a custom auth variable, limiting the server's access initializeApp({ // 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 const db = getDatabase(); const ref = db.ref("/some_resource"); ref.once("value", (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())
Go
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 die Admin SDKs möglicherweise so einschränken, dass sie als nicht authentifizierter Client fungieren. Dazu geben Sie für die Überschreibung der Datenbankauthentifizierungsvariable den Wert null an.
Java
// Initialize the app with Application Default Credentials FirebaseOptions options = FirebaseOptions.builder() .setCredentials(GoogleCredentials.getApplicationDefault()) // 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
import { initializeApp } from 'firebase-admin/app'; import { getDatabase } from 'firebase-admin/database'; // Initialize the app with a null auth variable, limiting the server's access initializeApp({ // 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 const db = getDatabase(); const ref = db.ref("/public_resource"); ref.once("value", (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())
Go
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)