驗證 REST 要求

Firebase SDK 會代您處理所有驗證作業,並與 Firebase Realtime Database 進行通訊。不過,如果您所在的環境沒有用戶端 SDK,或是您想避免永久性資料庫連線的額外負擔,可以使用 Realtime Database REST API 讀取及寫入資料。

透過下列任一方法驗證使用者:

  1. Google OAuth2 存取權杖:通常,讀取及寫入 Realtime Database 的權限會受 Realtime Database 規則管控。不過,您可以透過服務帳戶產生的 Google OAuth2 存取權杖,從伺服器存取資料,並授予該伺服器對資料的完整讀取和寫入權限。

  2. Firebase ID 權杖:您可能也想傳送以個別使用者身分驗證的請求,例如在用戶端 SDK 上使用 Realtime Database 規則限制存取權。REST API 會接受用戶端 SDK 使用的相同 Firebase ID 權杖。

Google OAuth2 存取權杖

任何符合您Realtime Database規則的公開可讀或可寫資料,也可以透過 REST API 讀取及寫入,無須進行任何驗證。不過,如果您希望伺服器略過 Realtime Database 規則,就必須驗證讀取和寫入要求。透過 Google OAuth2 進行驗證時,需要完成下列步驟:

  1. 產生存取權杖。
  2. 使用該存取權杖進行驗證。

產生存取權杖

Realtime Database REST API 可接受標準 Google OAuth2 存取權杖。您可以使用具備 Realtime Database 適當權限的服務帳戶,產生存取權杖。按一下 Firebase 控制台「服務帳戶」部分底部的「產生新的私密金鑰」按鈕,即可輕鬆產生新的服務帳戶金鑰檔案 (如果您尚未擁有此檔案)。

取得服務帳戶金鑰檔案後,您可以使用其中一個 Google API 用戶端程式庫,透過下列必要範圍產生 Google OAuth2 存取權杖:

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

以下是一些實作範例,說明如何建立 Google OAuth2 存取權杖,以便透過各種語言驗證 Realtime Database REST API:

Node.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

使用 適用於 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

使用存取權杖驗證

如要向 Realtime Database 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> 替換為 Realtime Database 的名稱,並將 <ACCESS_TOKEN> 替換為 Google OAuth2 存取權杖。

成功的要求會以 200 OK HTTP 狀態碼表示。回應中包含要擷取的資料:

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

Firebase ID 權杖

當使用者或裝置使用 Firebase Authentication 登入時,Firebase 會建立對應的 ID 權杖,用於唯一識別使用者或裝置,並授予他們存取多個資源的權限,例如 Realtime DatabaseCloud Storage。您可以重複使用該 ID 權杖來驗證 Realtime Database REST API,並代表該使用者提出要求。

產生 ID 權杖

如要從用戶端擷取 Firebase ID 權杖,請按照「在用戶端擷取 ID 權杖」中的步驟操作。

請注意,ID 權杖會在短時間內失效,因此應在擷取後盡快使用。

使用 ID 權杖進行驗證

如要將經過驗證的要求傳送至 Realtime Database REST API,請將上述產生的 ID 權杖做為 auth=<ID_TOKEN> 查詢字串參數傳遞。以下是讀取 Ada 名稱的 curl 要求範例:

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

請務必將 <DATABASE_NAME> 替換為 Realtime Database 的名稱,並將 <ID_TOKEN> 替換為 Firebase ID 權杖。

成功的要求會以 200 OK HTTP 狀態碼表示。回應中包含要擷取的資料:

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

舊版符記

如果您仍在使用舊版 Firebase 驗證權杖,建議您將 REST 驗證更新為上述任一驗證方法。

Realtime Database REST API 仍支援透過舊版驗證權杖 (包括密鑰) 進行驗證。您可以在 Firebase 控制台的「服務帳戶」專區中找到 Realtime Database 機密。

密鑰是長期憑證。從專案中移除具有非公開資料存取權的使用者 (例如擁有者) 時,建議您產生新的非公開資料,並撤銷現有的非公開資料。