Firebase SDK 會代您處理所有驗證作業,並與 Firebase Realtime Database 進行通訊。不過,如果您所在的環境沒有用戶端 SDK,或是想避免持續資料庫連線造成負擔,可以使用 Realtime Database REST API 讀取及寫入資料。
透過下列任一方法驗證使用者:
Google OAuth2 存取權杖:通常,讀取及寫入 Realtime Database 的權限會受 Realtime Database 規則管控。不過,您可以透過服務帳戶產生的 Google OAuth2 存取權杖,從伺服器存取資料,並授予該伺服器對資料的完整讀取和寫入權限。
Firebase ID 權杖:您可能也想傳送以個別使用者身分驗證的請求,例如使用 Realtime Database 規則限制用戶端 SDK 的存取權。REST API 會接受用戶端 SDK 使用的相同 Firebase ID 權杖。
Google OAuth2 存取權杖
任何依據 Realtime Database 規則可公開讀取或寫入的資料,也都能透過 REST API 讀取及寫入,完全不需要驗證。不過,如果您希望伺服器略過 Realtime Database 規則,就必須驗證讀取和寫入要求。透過 Google OAuth2 進行驗證需要執行以下步驟:
- 產生存取權杖。
- 使用該存取權杖進行驗證。
產生存取權杖
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 Database 和 Cloud 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 機密。
密鑰是長期憑證。建議您在從專案中移除具有密鑰存取權的使用者 (例如擁有者) 時,產生新的密鑰並撤銷現有密鑰。