获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

将 Firebase Admin SDK 添加到您的服务器

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

Admin SDK 是一组服务器库,可让您从特权环境与 Firebase 交互以执行以下操作:

  • 以完全管理员权限读取和写入实时数据库数据。
  • 使用 Firebase 云消息传递服务器协议的简单替代方法以编程方式发送 Firebase 云消息传递消息。
  • 生成并验证 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 主题订阅
云储存
云端 Firestore
项目管理
安全规则
机器学习模型管理
Firebase 远程配置
Firebase 应用检查
火力地堡扩展

要详细了解这些用途的 Admin SDK 集成,请参阅相应的实时数据库FCM身份验证远程配置云存储文档。本页的其余部分重点介绍 Admin SDK 的基本设置。

先决条件

  • 确保您有一个服务器应用程序。

  • 确保您的服务器根据您使用的 Admin SDK 运行以下内容:

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

设置 Firebase 项目和服务帐户

要使用 Firebase Admin SDK,您需要具备以下条件:

  • 一个 Firebase 项目。
  • 用于与 Firebase 通信的 Firebase Admin SDK 服务帐户。当您创建 Firebase 项目或将 Firebase 添加到 Google Cloud 项目时,会自动创建此服务帐号。
  • 包含您的服务帐户凭据的配置文件。

如果您还没有 Firebase 项目,则需要在Firebase 控制台中创建一个。访问了解 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:9.1.1'
}

如果您使用 Maven 构建您的应用程序,您可以将以下依赖项添加到您的pom.xml

<dependency>
  <groupId>com.google.firebase</groupId>
  <artifactId>firebase-admin</artifactId>
  <version>9.1.1</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 控制台中,打开设置 >服务帐户

  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 环境中是完全自动化的,无需提供环境变量或其他配置,因此强烈建议将这种初始化 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);

设置实时数据库和身份验证的范围

如果您将 Google Compute Engine VM 与用于实时数据库或身份验证的 Google 应用程序默认凭据一起使用,请确保还设置了正确的访问范围。对于实时数据库和身份验证,您需要以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 应用程序默认凭据在本地测试 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 功能添加到您的应用: