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

验证 REST 请求

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

Firebase SDK 代表您处理所有身份验证以及与 Firebase 实时数据库的通信。但是,当您处于没有客户端 SDK 的环境中或者您想要避免持久数据库连接的开销时,您可以使用实时数据库 REST API 来读取和写入数据。

通过以下方法之一对用户进行身份验证:

  1. Google OAuth2 访问令牌- 通常,读取和写入实时数据库的能力受实时数据库规则约束。但是,您可以从服务器访问您的数据,并使用从服务帐户生成的 Google OAuth2 访问令牌授予该服务器对您的数据的完全读写访问权限。

  2. Firebase ID 令牌- 您可能还希望发送经过身份验证的个人用户请求,例如在客户端 SDK 上使用实时数据库规则限制访问。 REST API 接受客户端 SDK 使用的相同 Firebase ID 令牌。

谷歌 OAuth2 访问令牌

根据您的实时数据库规则公开可读或可写的任何数据也可通过 REST API 读取和写入,无需任何身份验证。但是,如果您希望您的服务器绕过您的实时数据库规则,则需要对您的读写请求进行身份验证。通过 Google OAuth2 进行身份验证需要以下步骤:

  1. 生成访问令牌。
  2. 使用该访问令牌进行身份验证。

生成访问令牌

实时数据库 REST API 接受标准的Google OAuth2 访问令牌。可以使用对您的实时数据库具有适当权限的服务帐户生成访问令牌。单击 Firebase 控制台服务帐户部分底部的生成新私钥按钮可让您轻松生成新的服务帐户密钥文件(如果您还没有的话)。

拥有服务帐户密钥文件后,您可以使用Google API 客户端库之一生成具有以下所需范围的 Google OAuth2 访问令牌:

  • https://www.googleapis.com/auth/userinfo.email
  • https://www.googleapis.com/auth/firebase.database

以下是一些示例实现,展示了如何创建 Google OAuth2 访问令牌以对各种语言的实时数据库 REST API 进行身份验证:

节点.js

使用适用于 Node.js 的 Google API 客户端库

var {google} = require("googleapis");

// Load the service account key JSON file.
var serviceAccount = require("path/to/serviceAccountKey.json");

// Define the required scopes.
var scopes = [
  "https://www.googleapis.com/auth/userinfo.email",
  "https://www.googleapis.com/auth/firebase.database"
];

// Authenticate a JWT client with the service account.
var jwtClient = new google.auth.JWT(
  serviceAccount.client_email,
  null,
  serviceAccount.private_key,
  scopes
);

// Use the JWT client to generate an access token.
jwtClient.authorize(function(error, tokens) {
  if (error) {
    console.log("Error making request to generate access token:", error);
  } else if (tokens.access_token === null) {
    console.log("Provided service account does not have permission to generate access tokens");
  } else {
    var accessToken = tokens.access_token;

    // See the "Using the access token" section below for information
    // on how to use the access token to send authenticated requests to
    // the Realtime Database REST API.
  }
});

爪哇

使用适用于 Java 的 Google API 客户端库

// Load the service account key JSON file
FileInputStream serviceAccount = new FileInputStream("path/to/serviceAccountKey.json");

// Authenticate a Google credential with the service account
GoogleCredential googleCred = GoogleCredential.fromStream(serviceAccount);

// Add the required scopes to the Google credential
GoogleCredential scoped = googleCred.createScoped(
    Arrays.asList(
      "https://www.googleapis.com/auth/firebase.database",
      "https://www.googleapis.com/auth/userinfo.email"
    )
);

// Use the Google credential to generate an access token
scoped.refreshToken();
String token = scoped.getAccessToken();

// See the "Using the access token" section below for information
// on how to use the access token to send authenticated requests to the
// Realtime Database REST API.

Python

使用google-auth库:

from google.oauth2 import service_account
from google.auth.transport.requests import AuthorizedSession

# Define the required scopes
scopes = [
  "https://www.googleapis.com/auth/userinfo.email",
  "https://www.googleapis.com/auth/firebase.database"
]

# Authenticate a credential with the service account
credentials = service_account.Credentials.from_service_account_file(
    "path/to/serviceAccountKey.json", scopes=scopes)

# Use the credentials object to authenticate a Requests session.
authed_session = AuthorizedSession(credentials)
response = authed_session.get(
    "https://<DATABASE_NAME>.firebaseio.com/users/ada/name.json")

# Or, use the token directly, as described in the "Authenticate with an
# access token" section below. (not recommended)
request = google.auth.transport.requests.Request()
credentials.refresh(request)
access_token = credentials.token

使用访问令牌进行身份验证

要向实时数据库 REST API 发送经过身份验证的请求,请将上面生成的 Google OAuth2 访问令牌作为Authorization: Bearer <ACCESS_TOKEN>标头或access_token=<ACCESS_TOKEN>查询字符串参数传递。下面是读取 Ada 名字的示例curl请求:

curl "https://<DATABASE_NAME>.firebaseio.com/users/ada/name.json?access_token=<ACCESS_TOKEN>"

确保将<DATABASE_NAME>替换为您的实时数据库名称,并将<ACCESS_TOKEN>替换为 Google OAuth2 访问令牌。

成功的请求将由200 OK HTTP 状态代码指示。响应包含正在检索的数据:

{"first":"Ada","last":"Lovelace"}

Firebase ID 令牌

当用户或设备使用 Firebase 身份验证登录时,Firebase 会创建一个相应的 ID 令牌来唯一标识他们并授予他们访问多种资源的权限,例如实时数据库和云存储。您可以重新使用该 ID 令牌对实时数据库 REST API 进行身份验证并代表该用户发出请求。

生成 ID 令牌

要从客户端检索 Firebase ID 令牌,请按照在客户端检索 ID 令牌中的步骤操作。

请注意,ID 令牌会在短时间后过期,取回后应尽快使用。

使用 ID 令牌进行身份验证

要将经过身份验证的请求发送到实时数据库 REST API,请将上面生成的 ID 令牌作为auth=<ID_TOKEN>查询字符串参数传递。下面是读取 Ada 名字的示例curl请求:

curl "https://<DATABASE_NAME>.firebaseio.com/users/ada/name.json?auth=<ID_TOKEN>"

确保将<DATABASE_NAME>替换为您的实时数据库名称,将<ID_TOKEN>替换为 Firebase ID 令牌。

成功的请求将由200 OK HTTP 状态代码指示。响应包含正在检索的数据:

{"first":"Ada","last":"Lovelace"}

遗留代币

如果您仍在使用旧版 Firebase 身份验证令牌,我们建议将您的 REST 身份验证更新为上述身份验证方法之一。

实时数据库 REST API 仍然支持通过旧的身份验证令牌(包括secrets )进行身份验证。您可以在 Firebase 控制台的服务帐户部分找到您的实时数据库机密。