Dodawanie pakietu Firebase Admin SDK do serwera

Pakiet Admin SDK to zestaw bibliotek serwera, który umożliwia interakcję z Firebase w środowiskach z podwyższonymi uprawnieniami w celach takich jak:

  • Odczytywanie i zapisywanie danych Bazy danych czasu rzeczywistego z pełnymi uprawnieniami administratora.
  • Automatycznie wysyłaj wiadomości Komunikacja w chmurze Firebase (FCM), korzystając z prostego, alternatywnego podejścia do protokołów serwera Komunikacji w chmurze Firebase (FCM)
  • generować i weryfikować tokeny uwierzytelniania Firebase;
  • Uzyskaj dostęp do zasobów Google Cloud, takich jak zasobniki Cloud Storage i bazy danych Cloud Firestore powiązane z Twoimi projektami Firebase.
  • Utwórz własną, uproszczoną konsolę administracyjną, aby móc na przykład wyszukiwać dane użytkowników i zmieniać ich adres e-mail na potrzeby uwierzytelniania.

Jeśli chcesz używać pakietu SDK Node.js jako klienta dostępu dla użytkowników (np. w aplikacji komputerowej Node.js lub aplikacji IoT), a nie używać dostępu administracyjnego ze środowiska uprzywilejowanego (takiego jak serwer), postępuj zgodnie z instrukcjami konfigurowania pakietu SDK JavaScript klienta.

Oto tabela funkcji pokazujących, które funkcje Firebase są obsługiwane w poszczególnych językach:

Funkcja Node.js Java Python Go C#
Emitowanie tokenów niestandardowych
Weryfikacja tokena tożsamości
Zarządzanie użytkownikami
Kontrola dostępu za pomocą roszczeń niestandardowych
Odśwież unieważnienie tokena
Importuj konta użytkowników
Zarządzanie plikami cookie sesji
Generowanie linków do działań związanych z e-mailami
Zarządzanie konfiguracjami dostawcy SAML/OIDC
Obsługa środowiska wielu najemców
Baza danych czasu rzeczywistego *
Komunikacja w chmurze Firebase
FCM Multicast
Zarządzanie subskrypcjami tematów w FCM
Cloud Storage,
Cloud Firestore.
Dodawanie funkcji do kolejki za pomocą Cloud Tasks
Zarządzanie projektami
Reguły zabezpieczeń
Zarządzanie modelami ML
Zdalna konfiguracja Firebase
Sprawdzanie aplikacji Firebase
Rozszerzenia Firebase

Więcej informacji o integracji z pakietem Admin SDK w tych celach znajdziesz w dokumentacji dotyczącej bazy danych czasu rzeczywistego, FCM, uwierzytelniania, zdalnej konfiguracji i Cloud Storage. Pozostała część tej strony dotyczy podstawowej konfiguracji pakietu Admin SDK.

Wymagania wstępne

  • Sprawdź, czy masz aplikację serwerową.

  • W zależności od używanego pakietu SDK upewnij się, że Twój serwer obsługuje te funkcje:

    • Pakiet Admin Node.js SDK – Node.js w wersji 14 lub nowszej (zalecamy Node.js 16 lub nowszy).
      Obsługa Node.js 14 została wycofana.
    • Admin Java SDK – Java 8+
    • Admin Python SDK – Python 3.7 lub nowszy (zalecamy Pythona 3.8 lub nowszą wersją)
      Obsługa Pythona 3.7 została wycofana.
    • Pakiet SDK Admin Go – Go w wersji 1.20 lub nowszej
    • Admin .NET SDK – .NET Framework 4.6.2 lub .NET Standard 2.0 dla .NET 6.0 i nowszych

Skonfiguruj projekt i konto usługi Firebase

Aby korzystać z pakietu Firebase Admin SDK, musisz mieć:

  • Masz projekt Firebase.
  • Konto usługi pakietu Firebase Admin SDK do komunikacji z Firebase. Jest ono tworzone automatycznie podczas tworzenia projektu Firebase lub dodawania Firebase do projektu Google Cloud.
  • Plik konfiguracji z danymi logowania do konta usługi.

Jeśli nie masz jeszcze projektu Firebase, musisz go utworzyć w konsoli Firebase. Więcej informacji o projektach Firebase znajdziesz w artykule Omówienie projektów Firebase.

Dodaj SDK

Jeśli konfigurujesz nowy projekt, musisz zainstalować pakiet SDK w wybranym języku.

Node.js

Pakiet SDK Firebase Admin Node.js jest dostępny w npm. Jeśli nie masz jeszcze pliku package.json, utwórz go w usłudze npm init. Następnie zainstaluj pakiet npm firebase-admin i zapisz go w package.json:

npm install firebase-admin --save

Aby użyć modułu w aplikacji, require z dowolnego pliku JavaScript:

const { initializeApp } = require('firebase-admin/app');

Jeśli korzystasz z wersji ES2015, możesz import ten moduł:

import { initializeApp } from 'firebase-admin/app';

Java

Pakiet Firebase Admin Java SDK został opublikowany w centralnym repozytorium Maven. Aby zainstalować bibliotekę, zadeklaruj ją jako zależność w pliku build.gradle:

dependencies {
  implementation 'com.google.firebase:firebase-admin:9.3.0'
}

Jeśli do tworzenia aplikacji używasz narzędzia Maven, możesz dodać do interfejsu pom.xml tę zależność:

<dependency>
  <groupId>com.google.firebase</groupId>
  <artifactId>firebase-admin</artifactId>
  <version>9.3.0</version>
</dependency>

Python

Pakiet SDK Firebase Admin jest dostępny przez pip. Bibliotekę możesz zainstalować dla wszystkich użytkowników za pomocą sudo:

sudo pip install firebase-admin

Możesz też zainstalować bibliotekę tylko dla bieżącego użytkownika, przekazując flagę --user:

pip install --user firebase-admin

Go

Pakiet Go Admin SDK można zainstalować przy użyciu narzędzia go get:

# Install the latest version:
go get firebase.google.com/go/v4@latest

# Or install a specific version:
go get firebase.google.com/go/[email protected]

C#

Pakiet .NET Admin SDK można zainstalować za pomocą menedżera pakietów .NET:

Install-Package FirebaseAdmin -Version 3.0.0

Możesz też zainstalować go za pomocą narzędzia wiersza poleceń dotnet:

dotnet add package FirebaseAdmin --version 3.0.0

Możesz też zainstalować ten plik, dodając do pliku .csproj ten wpis w odniesieniu do pakietu:

<ItemGroup>
  <PackageReference Include="FirebaseAdmin" Version="3.0.0" />
</ItemGroup>

Zainicjuj pakiet SDK

Po utworzeniu projektu Firebase możesz zainicjować pakiet SDK przy użyciu domyślnych danych logowania Google aplikacji. Ze względu na to, że wyszukiwanie domyślnych danych logowania w środowiskach Google jest w pełni zautomatyzowane, nie trzeba podawać zmiennych środowiskowych ani innej konfiguracji, ten sposób inicjowania pakietu SDK jest zdecydowanie zalecany w przypadku aplikacji działających w środowiskach Google, takich jak Cloud Run, App Engine i Cloud Functions.

Aby opcjonalnie określić opcje inicjowania usług, takich jak Baza danych czasu rzeczywistego, Cloud Storage czy Cloud Functions, użyj zmiennej środowiskowej FIREBASE_CONFIG. Jeśli zawartość zmiennej FIREBASE_CONFIG zaczyna się od {, zostanie ona przeanalizowana jako obiekt JSON. W przeciwnym razie pakiet SDK zakłada, że ciąg znaków jest ścieżką pliku JSON zawierającego opcje.

Node.js

const app = initializeApp();

Java

FirebaseApp.initializeApp();

Python

default_app = firebase_admin.initialize_app()

Go

app, err := firebase.NewApp(context.Background(), nil)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

C#

FirebaseApp.Create();

Po jego zainicjowaniu możesz wykonywać za pomocą pakietu Admin SDK te zadania:

Używanie tokena odświeżania OAuth 2.0

Pakiet Admin SDK udostępnia też dane logowania umożliwiające uwierzytelnianie przy użyciu tokena odświeżania Google OAuth2:

Node.js

const myRefreshToken = '...'; // Get refresh token from OAuth2 flow

initializeApp({
  credential: refreshToken(myRefreshToken),
  databaseURL: 'https://<DATABASE_NAME>.firebaseio.com'
});

Java

FileInputStream refreshToken = new FileInputStream("path/to/refreshToken.json");

FirebaseOptions options = FirebaseOptions.builder()
    .setCredentials(GoogleCredentials.fromStream(refreshToken))
    .setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/")
    .build();

FirebaseApp.initializeApp(options);

Python

cred = credentials.RefreshToken('path/to/refreshToken.json')
default_app = firebase_admin.initialize_app(cred)

Go

opt := option.WithCredentialsFile("path/to/refreshToken.json")
config := &firebase.Config{ProjectID: "my-project-id"}
app, err := firebase.NewApp(context.Background(), config, opt)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

C#

FirebaseApp.Create(new AppOptions()
{
    Credential = GoogleCredential.FromFile("path/to/refreshToken.json"),
});

Inicjowanie pakietu SDK w środowiskach innych niż Google

Jeśli pracujesz w środowisku serwera innym niż Google, w którym domyślne wyszukiwanie danych logowania nie może być w pełni zautomatyzowane, możesz zainicjować pakiet SDK przy użyciu wyeksportowanego pliku klucza konta usługi.

Projekty Firebase obsługują konta usługi Google, których możesz używać do wywoływania interfejsów API serwera Firebase z serwera aplikacji lub zaufanego środowiska. Jeśli tworzysz kod lokalnie lub wdrażasz aplikację lokalną, do autoryzowania żądań serwera możesz używać danych logowania uzyskanych za pomocą tego konta usługi.

Aby uwierzytelnić konto usługi i autoryzować je do uzyskiwania dostępu do usług Firebase, musisz wygenerować plik klucza prywatnego w formacie JSON.

Aby wygenerować plik klucza prywatnego dla konta usługi:

  1. W konsoli Firebase otwórz Ustawienia > Konta usługi.

  2. Kliknij Wygeneruj nowy klucz prywatny i potwierdź, klikając Wygeneruj klucz.

  3. Bezpiecznie przechowuj plik JSON zawierający klucz.

W przypadku autoryzacji za pomocą konta usługi masz 2 możliwości udostępnienia danych logowania do aplikacji. Możesz ustawić zmienną środowiskową GOOGLE_APPLICATION_CREDENTIALS lub przekazać w kodzie ścieżkę do klucza konta usługi. Pierwsza opcja jest bezpieczniejsza i zdecydowanie zalecamy jej stosowanie.

Aby ustawić zmienną środowiskową:

Ustaw zmienną środowiskową GOOGLE_APPLICATION_CREDENTIALS na ścieżkę pliku JSON zawierającego klucz konta usługi. Ta zmienna ma zastosowanie tylko do bieżącej sesji powłoki, więc jeśli otworzysz nową sesję, ustaw ją ponownie.

Linux lub macOS,

export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"

Windows

Za pomocą PowerShell:

$env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\service-account-file.json"

Gdy wykonasz podane wyżej czynności, domyślne dane logowania aplikacji (ADC) będą mogły niejawnie określić Twoje dane logowania, dzięki czemu możesz używać danych logowania konta usługi podczas testowania lub uruchamiania ich w środowiskach innych niż Google.

Zainicjuj pakiet SDK w ten sposób:

Node.js

initializeApp({
    credential: applicationDefault(),
    databaseURL: 'https://<DATABASE_NAME>.firebaseio.com'
});

Java

FirebaseOptions options = FirebaseOptions.builder()
    .setCredentials(GoogleCredentials.getApplicationDefault())
    .setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/")
    .build();

FirebaseApp.initializeApp(options);

Python

default_app = firebase_admin.initialize_app()

Go

app, err := firebase.NewApp(context.Background(), nil)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

C#

FirebaseApp.Create(new AppOptions()
{
    Credential = GoogleCredential.GetApplicationDefault(),
    ProjectId = "my-project-id",
});

Inicjowanie wielu aplikacji

W większości przypadków wystarczy zainicjować tylko jedną domyślną aplikację. Dostęp do usług możesz uzyskać z niej na 2 równoważne sposoby:

Node.js

// Initialize the default app
const defaultApp = initializeApp(defaultAppConfig);

console.log(defaultApp.name);  // '[DEFAULT]'

// Retrieve services via the defaultApp variable...
let defaultAuth = getAuth(defaultApp);
let defaultDatabase = getDatabase(defaultApp);

// ... or use the equivalent shorthand notation
defaultAuth = getAuth();
defaultDatabase = getDatabase();

Java

// Initialize the default app
FirebaseApp defaultApp = FirebaseApp.initializeApp(defaultOptions);

System.out.println(defaultApp.getName());  // "[DEFAULT]"

// Retrieve services by passing the defaultApp variable...
FirebaseAuth defaultAuth = FirebaseAuth.getInstance(defaultApp);
FirebaseDatabase defaultDatabase = FirebaseDatabase.getInstance(defaultApp);

// ... or use the equivalent shorthand notation
defaultAuth = FirebaseAuth.getInstance();
defaultDatabase = FirebaseDatabase.getInstance();

Python

# Import the Firebase service
from firebase_admin import auth

# Initialize the default app
default_app = firebase_admin.initialize_app(cred)
print(default_app.name)  # "[DEFAULT]"

# Retrieve services via the auth package...
# auth.create_custom_token(...)

Go

// Initialize default app
app, err := firebase.NewApp(context.Background(), nil)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

// Access auth service from the default app
client, err := app.Auth(context.Background())
if err != nil {
	log.Fatalf("error getting Auth client: %v\n", err)
}

C#

// Initialize the default app
var defaultApp = FirebaseApp.Create(new AppOptions()
{
    Credential = GoogleCredential.GetApplicationDefault(),
});
Console.WriteLine(defaultApp.Name); // "[DEFAULT]"

// Retrieve services by passing the defaultApp variable...
var defaultAuth = FirebaseAuth.GetAuth(defaultApp);

// ... or use the equivalent shorthand notation
defaultAuth = FirebaseAuth.DefaultInstance;

Niektóre przypadki użycia wymagają utworzenia wielu aplikacji naraz. Możesz na przykład chcieć odczytywać dane z Bazy danych czasu rzeczywistego w jednym projekcie Firebase i tworzyć tokeny niestandardowe dla innego. Możesz też chcieć uwierzytelnić 2 aplikacje za pomocą osobnych danych logowania. Pakiet SDK Firebase umożliwia tworzenie wielu aplikacji jednocześnie, z których każda ma własne informacje konfiguracyjne.

Node.js

// Initialize the default app
initializeApp(defaultAppConfig);

// Initialize another app with a different config
var otherApp = initializeApp(otherAppConfig, 'other');

console.log(getApp().name);  // '[DEFAULT]'
console.log(otherApp.name);     // 'other'

// Use the shorthand notation to retrieve the default app's services
const defaultAuth = getAuth();
const defaultDatabase = getDatabase();

// Use the otherApp variable to retrieve the other app's services
const otherAuth = getAuth(otherApp);
const otherDatabase = getDatabase(otherApp);

Java

// Initialize the default app
FirebaseApp defaultApp = FirebaseApp.initializeApp(defaultOptions);

// Initialize another app with a different config
FirebaseApp otherApp = FirebaseApp.initializeApp(otherAppConfig, "other");

System.out.println(defaultApp.getName());  // "[DEFAULT]"
System.out.println(otherApp.getName());    // "other"

// Use the shorthand notation to retrieve the default app's services
FirebaseAuth defaultAuth = FirebaseAuth.getInstance();
FirebaseDatabase defaultDatabase = FirebaseDatabase.getInstance();

// Use the otherApp variable to retrieve the other app's services
FirebaseAuth otherAuth = FirebaseAuth.getInstance(otherApp);
FirebaseDatabase otherDatabase = FirebaseDatabase.getInstance(otherApp);

Python

# Initialize the default app
default_app = firebase_admin.initialize_app(cred)

#  Initialize another app with a different config
other_app = firebase_admin.initialize_app(cred, name='other')

print(default_app.name)    # "[DEFAULT]"
print(other_app.name)      # "other"

# Retrieve default services via the auth package...
# auth.create_custom_token(...)

# Use the `app` argument to retrieve the other app's services
# auth.create_custom_token(..., app=other_app)

Go

// Initialize the default app
defaultApp, err := firebase.NewApp(context.Background(), nil)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

// Initialize another app with a different config
opt := option.WithCredentialsFile("service-account-other.json")
otherApp, err := firebase.NewApp(context.Background(), nil, opt)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

// Access Auth service from default app
defaultClient, err := defaultApp.Auth(context.Background())
if err != nil {
	log.Fatalf("error getting Auth client: %v\n", err)
}

// Access auth service from other app
otherClient, err := otherApp.Auth(context.Background())
if err != nil {
	log.Fatalf("error getting Auth client: %v\n", err)
}

C#

// Initialize the default app
var defaultApp = FirebaseApp.Create(defaultOptions);

// Initialize another app with a different config
var otherApp = FirebaseApp.Create(otherAppConfig, "other");

Console.WriteLine(defaultApp.Name); // "[DEFAULT]"
Console.WriteLine(otherApp.Name); // "other"

// Use the shorthand notation to retrieve the default app's services
var defaultAuth = FirebaseAuth.DefaultInstance;

// Use the otherApp variable to retrieve the other app's services
var otherAuth = FirebaseAuth.GetAuth(otherApp);

Ustawianie zakresów bazy danych czasu rzeczywistego i uwierzytelniania

Jeśli używasz maszyny wirtualnej Google Compute Engine z domyślnymi danymi logowania aplikacji Google na potrzeby uwierzytelniania lub bazy danych czasu rzeczywistego, pamiętaj o ustawieniu odpowiednich zakresów dostępu. Do korzystania z Bazy danych czasu rzeczywistego i uwierzytelniania potrzebujesz zakresów z końcówką userinfo.email oraz cloud-platform lub firebase.database. Aby sprawdzić istniejące zakresy dostępu i je zmienić, uruchom następujące polecenia za pomocą gcloud.

gcloud

# Check the existing access scopes
gcloud compute instances describe [INSTANCE_NAME] --format json

# The above command returns the service account information. For example:
  "serviceAccounts": [
   {
    "email": "your.gserviceaccount.com",
    "scopes": [
     "https://www.googleapis.com/auth/cloud-platform",
     "https://www.googleapis.com/auth/userinfo.email"
     ]
    }
  ],

# Stop the VM, then run the following command, using the service account
# that gcloud returned when you checked the scopes.

gcloud compute instances set-service-account [INSTANCE_NAME] --service-account "your.gserviceaccount.com" --scopes "https://www.googleapis.com/auth/firebase.database,https://www.googleapis.com/auth/userinfo.email"

Testowanie za pomocą danych logowania użytkownika gcloud

Podczas lokalnego testowania pakietu Admin SDK za pomocą domyślnych danych logowania aplikacji Google uzyskanych za pomocą uruchomienia gcloud auth application-default login trzeba wprowadzić dodatkowe zmiany, aby móc korzystać z uwierzytelniania Firebase. Oto powody:

  • Uwierzytelnianie Firebase nie akceptuje danych logowania użytkownika gcloud wygenerowanych za pomocą identyfikatora klienta OAuth gcloud.
  • Uwierzytelnianie Firebase wymaga podawania identyfikatora projektu podczas inicjowania tego typu danych logowania użytkownika.

Aby obejść ten problem, możesz wygenerować domyślne dane uwierzytelniające aplikacji Google w gcloud przy użyciu własnego identyfikatora klienta OAuth 2.0. Identyfikator klienta OAuth musi być typem aplikacji Aplikacja komputerowa.

gcloud

gcloud auth application-default login --client-id-file=[/path/to/client/id/file]

Możesz podać identyfikator projektu jawnie podczas inicjowania aplikacji lub użyć po prostu zmiennej środowiskowej GOOGLE_CLOUD_PROJECT. Dzięki temu unikasz konieczności wprowadzania dodatkowych zmian w celu testowania kodu.

Aby wyraźnie określić identyfikator projektu:

Node.js

import { initializeApp, applicationDefault } from 'firebase-admin/app';

initializeApp({
  credential: applicationDefault(),
  projectId: '<FIREBASE_PROJECT_ID>',
});

Java

FirebaseOptions options = FirebaseOptions.builder()
    .setCredentials(GoogleCredentials.getApplicationDefault())
    .setProjectId("<FIREBASE_PROJECT_ID>")
    .build();

FirebaseApp.initializeApp(options);

Python

app_options = {'projectId': '<FIREBASE_PROJECT_ID>'}
default_app = firebase_admin.initialize_app(options=app_options)

Go

config := &firebase.Config{ProjectID: "<FIREBASE_PROJECT_ID>"}
app, err := firebase.NewApp(context.Background(), config)
if err != nil {
        log.Fatalf("error initializing app: %v\n", err)
}

C#

FirebaseApp.Create(new AppOptions()
{
    Credential = GoogleCredential.GetApplicationDefault(),
    ProjectId = "<FIREBASE_PROJECT_ID>",
});

Dalsze kroki

Więcej informacji o Firebase:

Dodaj funkcje Firebase do swojej aplikacji: