Mit dem Admin SDK können Sie mit vollständigen Administratorberechtigungen oder mit feiner abgestuften, eingeschränkten Berechtigungen Daten in der Realtime Database lesen und schreiben. In diesem Dokument erfahren Sie, wie Sie das Firebase Admin SDK Ihrem Projekt hinzufü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 authentifizieren sich mit einem Dienstkonto das Ihren Server bei Firebase identifiziert.
Bei der Authentifizierung mit dem Firebase Admin SDK können Sie zwei verschiedene Zugriffsebenen erhalten:
| Zugriffsebenen für die Firebase Admin SDK-Authentifizierung | |
|---|---|
| Administratorberechtigungen | Vollständiger Lese- und Schreibzugriff auf die Realtime Database eines Projekts. Mit Vorsicht verwenden, um administrative Aufgaben wie die Datenmigration oder -umstrukturierung auszuführen, für die uneingeschränkter Zugriff auf die Ressourcen Ihres Projekts erforderlich ist. |
| 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 in der gesamten Datenbank gelesen werden, können Sie sich vor versehentlichen Schreibvorgängen schützen, indem Sie eine schreibgeschützte Sicherheitsregel festlegen und dann das Admin SDK mit Berechtigungen initialisieren, die durch diese Regel eingeschränkt sind. |
Mit Administratorberechtigungen authentifizieren
Wenn Sie das Firebase Admin SDK mit den Anmeldedaten für ein Dienst konto mit der Rolle Bearbeiter in Ihrem 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)
Mit eingeschränkten Berechtigungen authentifizieren
Best Practice ist, dass ein Dienst nur Zugriff auf die Ressourcen haben sollte, die er benötigt. Wenn Sie den Zugriff einer Firebase-App-Instanz auf Ressourcen genauer steuern möchten, verwenden Sie in Ihren Sicherheitsregeln eine eindeutige ID, 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 auth-Objekt zu überschreiben, das von Ihren Datenbankregeln verwendet wird. Legen Sie in diesem benutzerdefinierten auth-Objekt das Feld uid auf die ID fest, die Sie verwendet haben, um Ihren Dienst in Ihren Sicherheitsregeln darzustellen.
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 möglicherweise den Umfang der Admin SDKs so einschränken, dass sie als nicht authentifizierter Client fungieren. Dazu geben Sie für die Überschreibung der Datenbankauthentifizierungsvariablen 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)
Nächste Schritte
- Informationen zum Strukturieren von Daten für Realtime Database.
- Daten auf mehrere Datenbankinstanzen skalieren.
- Daten speichern
- Daten abrufen
- Datenbank in der Firebase Console ansehen.