Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

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

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

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

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

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

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

要了解更多有關管理SDK集成這些用途,請參見相應的實時數據庫FCM認證遠程配置,以及雲存儲的文檔。本頁的其餘部分重點介紹 Admin SDK 的基本設置。

先決條件

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

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

    • 管理 Node.js SDK — Node.js 12+
    • Admin Java SDK — Java 7+(推薦 Java 8+)
      不推薦使用 Java 7 支持。
    • 管理 Python SDK — Python 3.6+
    • Admin Go SDK — Go 1.11+
    • 管理員 .NET SDK — .NET Framework 4.5+ 或 .Net Core 1.5+

設置 Firebase 項目和服務帳號

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

  • 一個 Firebase 項目
  • 與 Firebase 通信的服務帳號
  • 包含您的服務帳戶憑據的配置文件

如果您還沒有一個火力地堡的項目,你需要創建一個在火力地堡控制台。參觀了解火力地堡項目,詳細了解項目的火力地堡。

添加開發工具包

如果您要設置新項目,則需要為您選擇的語言安裝 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:8.1.0'
}

如果你使用Maven構建應用程序,你可以添加以下依賴你pom.xml

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

Python

在火力地堡管理員的Python SDK是通過提供點子。您可以安裝通過所有用戶庫sudo

$ sudo pip install firebase-admin

或者,你可以通過安裝只是當前用戶的庫--user標誌:

$ pip install --user firebase-admin

旅途中的Admin SDK可以使用安裝go get工具:

# 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.2.0

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

$ dotnet add package FirebaseAdmin --version 2.2.0

或者,您可以通過將下面裝基準進入你安裝它.csproj文件:

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

初始化 SDK

一旦你創建了一個火力地堡項目,可以初始化與一起結合您的服務帳戶文件的授權策略的SDK谷歌應用程序的默認憑據

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

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

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

  1. 在火力地堡控制台,打開設置>服務帳戶

  2. 點擊生成新的私鑰,然後點擊確認生成密鑰

  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 刷新令牌

管理員SDK還提供了憑證,它允許您使用驗證谷歌的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 環境中是完全自動化的,無需提供環境變量或其他配置,因此強烈建議將這種初始化 SDK 的方式用於在 Compute Engine、Kubernetes Engine、App Engine 和 Cloud Functions 上運行的應用程序。

要選擇指定初始化選項服務,如實時數據庫,雲存儲或雲功能,使用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);

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

如果您使用的是谷歌Compute Engine的VM與谷歌應用程序的默認憑據實時數據庫或認證,確保還設置了正確的訪問範圍。對於實時數據庫和身份驗證,則需要在結束範圍userinfo.email ,要么cloud-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 最終用戶憑據進行測試

當與本地測試管理SDK谷歌應用程序的默認憑證運行獲得gcloud auth application-default login ,需要額外的更改使用火力地堡驗證因以下情況:

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

作為一種變通方法,您可以生成谷歌應用程序在默認憑據gcloud使用自己的OAuth 2.0客戶端ID 。的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 功能: