Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

將 Firebase Admin SDK 添加到您的服務器

透過集合功能整理內容 你可以依據偏好儲存及分類內容。

Admin SDK 是一組服務器庫,可讓您從特權環境與 Firebase 交互以執行以下操作:

  • 以完全管理員權限讀取和寫入實時數據庫數據。
  • 使用 Firebase Cloud Messaging 服務器協議的簡單替代方法以編程方式發送 Firebase Cloud Messaging 消息。
  • 生成並驗證 Firebase 身份驗證令牌。
  • 訪問與您的 Firebase 項目關聯的 Cloud Storage 存儲分區和 Cloud Firestore 數據庫等 Google Cloud 資源。
  • 創建您自己的簡化管理控制台來執行諸如查找用戶數據或更改用戶的電子郵件地址以進行身份驗證等操作。

如果您有興趣使用 Node.js SDK 作為最終用戶訪問的客戶端(例如,在 Node.js 桌面或 IoT 應用程序中),而不是從特權環境(如服務器)進行管理員訪問,您應改為遵循設置客戶端 JavaScript SDK 的說明

這是一個功能矩陣,顯示了每種語言支持的 Firebase 功能:

特徵節點.js爪哇PythonC#
自定義代幣鑄造
ID令牌驗證
用戶管理
使用自定義聲明控制訪問
刷新令牌撤銷
導入用戶
會話 Cookie 管理
生成電子郵件操作鏈接
管理 SAML/OIDC 提供程序配置
多租戶支持
實時數據庫 *
Firebase 雲消息傳遞
FCM 組播
管理 FCM 主題訂閱
雲儲存
雲防火牆
項目管理
安全規則
機器學習模型管理
Firebase 遠程配置
Firebase 應用檢查

要了解有關這些用途的 Admin SDK 集成的更多信息,請參閱相應的Realtime DatabaseFCMAuthenticationRemote ConfigCloud Storage文檔。本頁的其餘部分重點介紹 Admin SDK 的基本設置。

先決條件

  • 確保您有一個服務器應用程序。

  • 確保您的服務器根據您使用的 Admin SDK 運行以下內容:

    • 管理員 Node.js SDK — Node.js 14+
    • 管理員 Java SDK — Java 8+
    • 管理員 Python SDK — Python 3.6+(推薦 Python 3.7+)
    • 管理員 Go SDK — Go 1.15+
    • 管理員 .NET SDK — .NET Framework 4.6.1+ 或 .NET Standard 2.0 用於 .Net Core 2.0+

設置 Firebase 項目和服務帳號

要使用 Firebase Admin SDK,您需要具備以下條件:

  • 一個 Firebase 項目。
  • 用於與 Firebase 通信的 Firebase Admin SDK 服務帳號。當您創建 Firebase 項目或將 Firebase 添加到 Google Cloud 項目時,會自動創建此服務帳號。
  • 包含您的服務帳戶憑據的配置文件。

如果您還沒有 Firebase 項目,則需要在Firebase 控制台中創建一個。請訪問了解 Firebase 項目以了解有關 Firebase 項目的更多信息。

添加 SDK

如果您要設置新項目,則需要安裝您選擇的語言的 SDK。

節點.js

Firebase Admin Node.js SDK 在 npm 上可用。如果您還沒有package.json文件,請通過npm init創建一個。接下來,安裝firebase-admin npm 包並將其保存到您的package.json

$ npm install firebase-admin --save

require在您的應用程序中使用該模塊,請從任何 JavaScript 文件中獲取它:

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

如果你使用的是 ES2015,你可以import模塊:

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

爪哇

Firebase Admin Java SDK 已發佈到 Maven 中央存儲庫。要安裝該庫,請在build.gradle文件中將其聲明為依賴項:

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

如果您使用 Maven 構建您的應用程序,您可以將以下依賴項添加到您的pom.xml中:

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

Python

Firebase Admin Python SDK 可通過pip獲得。您可以通過sudo為所有用戶安裝庫:

$ sudo pip install firebase-admin

或者,您可以通過傳遞--user標誌僅為當前用戶安裝庫:

$ pip install --user firebase-admin

可以使用go get實用程序安裝 Go Admin SDK:

# Install as a module dependency
$ go get firebase.google.com/go/v4

# Install to $GOPATH
$ go get firebase.google.com/go

C#

可以使用 .NET 包管理器安裝 .NET Admin SDK:

$ Install-Package FirebaseAdmin -Version 2.3.0

或者,使用dotnet命令行實用程序安裝它:

$ dotnet add package FirebaseAdmin --version 2.3.0

或者,您可以通過將以下包引用條目添加到.csproj文件來安裝它:

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

初始化 SDK

創建 Firebase 項目後,您可以使用將服務帳戶文件與Google Application Default Credentials結合在一起的授權策略來初始化 SDK。

Firebase 項目支持 Google服務帳戶,您可以使用它從您的應用服務器或受信任的環境中調用 Firebase 服務器 API。如果您在本地開發代碼或在本地部署應用程序,則可以使用通過此服務帳戶獲得的憑據來授權服務器請求。

要對服務帳號進行身份驗證並授權其訪問 Firebase 服務,您必須生成 JSON 格式的私鑰文件。

要為您的服務帳戶生成私鑰文件:

  1. 在 Firebase 控制台中,打開Settings > Service Accounts

  2. 單擊Generate New Private Key ,然後單擊Generate Key進行確認。

  3. 安全地存儲包含密鑰的 JSON 文件。

通過服務帳戶進行授權時,您有兩種選擇來向您的應用程序提供憑據。您可以設置GOOGLE_APPLICATION_CREDENTIALS環境變量,也可以在代碼中將路徑顯式傳遞給服務帳戶密鑰。第一個選項更安全,強烈推薦。

設置環境變量:

將環境變量GOOGLE_APPLICATION_CREDENTIALS設置為包含您的服務帳號密鑰的 JSON 文件的文件路徑。此變量僅適用於您當前的 shell 會話,因此如果您打開一個新會話,請再次設置該變量。

Linux 或 macOS

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

視窗

使用 PowerShell:

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

完成上述步驟後,應用程序默認憑據 (ADC) 能夠隱式確定您的憑據,允許您在測試或在非 Google 環境中運行時使用服務帳戶憑據。

如圖所示初始化SDK:

節點.js

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

爪哇

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

FirebaseApp.initializeApp(options);

Python

default_app = firebase_admin.initialize_app()

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(),
});

使用 OAuth 2.0 刷新令牌

Admin SDK 還提供了一個憑據,允許您使用Google OAuth2刷新令牌進行身份驗證:

節點.js

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

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

爪哇

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)

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"),
});

無參數初始化

SDK 也可以不帶參數初始化。在這種情況下,SDK 使用Google Application Default Credentials 。由於默認憑據查找在 Google 環境中是完全自動化的,無需提供環境變量或其他配置,因此強烈建議在 Compute Engine、Kubernetes Engine、App Engine 和 Cloud Functions 上運行的應用程序使用這種初始化 SDK 的方式。

要選擇性地為實時數據庫、雲存儲或云函數等服務指定初始化選項,請使用FIREBASE_CONFIG環境變量。如果FIREBASE_CONFIG變量的內容以{開頭,它將被解析為 JSON 對象。否則,SDK 假定該字符串是包含選項的 JSON 文件的路徑。

節點.js

const app = initializeApp();

爪哇

FirebaseApp.initializeApp();

Python

default_app = firebase_admin.initialize_app()

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

C#

FirebaseApp.Create();

初始化後,您可以使用 Admin SDK 完成以下類型的任務:

初始化多個應用

在大多數情況下,您只需初始化一個默認應用程序。您可以通過兩種等效方式從該應用程序訪問服務:

節點.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();

爪哇

// 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(...)

// 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;

某些用例要求您同時創建多個應用程序。例如,您可能希望從一個 Firebase 項目的實時數據庫中讀取數據,並為另一個項目創建自定義令牌。或者您可能希望使用不同的憑據對兩個應用程序進行身份驗證。 Firebase SDK 允許您同時創建多個應用程序,每個應用程序都有自己的配置信息。

節點.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);

爪哇

// 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)

// 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);

設置實時數據庫和身份驗證的範圍

如果您將 Google Compute Engine VM 與 Google Application Default Credentials 用於實時數據庫或身份驗證,請確保還設置了正確的訪問範圍。對於實時數據庫和身份驗證,您需要以userinfo.emailcloud-platformfirebase.database結尾的範圍。要檢查現有訪問範圍並更改它們,請使用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"

使用 gcloud 最終用戶憑據進行測試

使用通過運行gcloud auth application-default login獲得的Google Application Default Credentials在本地測試 Admin SDK 時,需要進行其他更改才能使用 Firebase 身份驗證,原因如下:

  • Firebase 身份驗證不接受使用 gcloud OAuth 客戶端 ID 生成的 gcloud 最終用戶憑據。
  • Firebase 身份驗證要求在初始化這些類型的最終用戶憑據時提供項目 ID。

作為一種解決方法,您可以使用自己的OAuth 2.0 客戶端 IDgcloud中生成 Google 應用程序默認憑據。 OAuth 客戶端 ID 必須是桌面應用程序類型。

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

您可以在應用初始化時明確指定項目 ID,也可以只使用GOOGLE_CLOUD_PROJECT環境變量。後者避免了需要進行任何額外的更改來測試您的代碼。

要明確指定項目 ID:

節點.js

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

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

爪哇

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)

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>",
});

下一步

了解 Firebase:

為您的應用添加 Firebase 功能: