Xác thực yêu cầu REST

SDK Firebase thay mặt bạn xử lý mọi hoạt động xác thực và giao tiếp với Firebase Realtime Database Tuy nhiên, khi ở trong một môi trường không có SDK ứng dụng hoặc bạn muốn tránh chi phí phát sinh của một kết nối cơ sở dữ liệu liên tục, bạn có thể sử dụng Realtime Database API REST để đọc và ghi dữ liệu.

Xác thực người dùng thông qua một trong các phương thức sau:

  1. Mã truy cập Google OAuth2 – Thông thường, khả năng đọc và ghi vào Realtime Database chịu sự điều chỉnh của Realtime Database Quy tắc. Tuy nhiên, bạn có thể truy cập vào dữ liệu của mình từ một máy chủ và cấp cho máy chủ đó quyền truy cập đầy đủ để đọc và ghi vào dữ liệu của bạn bằng mã truy cập Google OAuth2 được tạo từ một tài khoản dịch vụ.

  2. Mã thông báo Firebase ID – Bạn cũng có thể muốn gửi các yêu cầu được xác thực dưới dạng một người dùng riêng lẻ, chẳng hạn như giới hạn quyền truy cập bằng Realtime Database Quy tắc trên các SDK ứng dụng. API REST chấp nhận cùng mã thông báo Firebase ID mà các SDK ứng dụng sử dụng.

Mã truy cập Google OAuth2

Mọi dữ liệu có thể đọc hoặc ghi công khai theo Realtime Database Quy tắc của bạn cũng có thể đọc và ghi thông qua API REST mà không cần xác thực. Tuy nhiên, nếu muốn máy chủ của bạn bỏ qua Quy tắc Realtime Database, bạn cần xác thực các yêu cầu đọc và ghi của mình. Việc xác thực thông qua Google OAuth2 yêu cầu các bước sau:

  1. Tạo mã truy cập.
  2. Xác thực bằng mã truy cập đó.

Tạo mã truy cập

API REST Realtime Database chấp nhận mã truy cập Google OAuth2 tiêu chuẩn. Bạn có thể tạo mã truy cập bằng tài khoản dịch vụ có quyền thích hợp đối với Realtime Database. Khi nhấp vào nút Tạo khoá riêng tư mới ở cuối phần Tài khoản dịch vụ của bảng điều khiển Firebase, bạn có thể dễ dàng tạo một tệp khoá tài khoản dịch vụ mới nếu chưa có.

Sau khi có tệp khoá tài khoản dịch vụ, bạn có thể sử dụng một trong các thư viện ứng dụng API của Google để tạo mã truy cập Google OAuth2 với các phạm vi bắt buộc sau:

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

Dưới đây là một số ví dụ về cách triển khai cho thấy cách tạo mã truy cập Google OAuth2 để xác thực với API REST bằng nhiều ngôn ngữ:Realtime Database

Node.js

Sử dụng Thư viện ứng dụng API của Google cho Node.js:

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

Sử dụng Thư viện ứng dụng API của Google cho Java:

// 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

Sử dụng thư viện 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

Xác thực bằng mã truy cập

Để gửi các yêu cầu đã xác thực đến API REST của Realtime Database, hãy truyền mã truy cập Google OAuth2 được tạo ở trên dưới dạng Authorization: Bearer <ACCESS_TOKEN> hoặc access_token=<ACCESS_TOKEN>. Dưới đây là ví dụ về yêu cầu curl để đọc tên của Ada:

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

Hãy nhớ thay thế <DATABASE_NAME> bằng tên của Realtime Database<ACCESS_TOKEN> bằng mã truy cập Google OAuth2.

Yêu cầu thành công sẽ được biểu thị bằng mã trạng thái HTTP 200 OK. Phản hồi chứa dữ liệu đang được truy xuất:

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

Mã thông báo Firebase ID

Khi người dùng hoặc thiết bị đăng nhập bằng Firebase Authentication, Firebase sẽ tạo một mã thông báo ID tương ứng để xác định duy nhất người dùng hoặc thiết bị đó và cấp cho họ quyền truy cập vào một số tài nguyên, chẳng hạn như Realtime DatabaseCloud Storage. Bạn có thể sử dụng lại mã thông báo ID đó để xác thực API REST của Realtime Database và đưa ra yêu cầu thay mặt cho người dùng đó.

Tạo mã thông báo ID

Để truy xuất mã thông báo Firebase ID từ ứng dụng, hãy làm theo các bước trong Truy xuất mã thông báo ID trên ứng dụng.

Xin lưu ý rằng mã thông báo ID sẽ hết hạn sau một khoảng thời gian ngắn và bạn nên sử dụng mã thông báo này càng sớm càng tốt sau khi truy xuất.

Xác thực bằng mã thông báo ID

Để gửi các yêu cầu đã xác thực đến API REST Realtime Database, hãy truyền mã thông báo ID được tạo ở trên dưới dạng tham số chuỗi truy vấn auth=<ID_TOKEN>. Dưới đây là ví dụ về yêu cầu curl để đọc tên của Ada:

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

Hãy nhớ thay thế <DATABASE_NAME> bằng tên của Realtime Database<ID_TOKEN> bằng mã thông báo Firebase ID.

Yêu cầu thành công sẽ được biểu thị bằng mã trạng thái HTTP 200 OK. Phản hồi chứa dữ liệu đang được truy xuất:

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

Mã thông báo cũ

Nếu vẫn đang sử dụng mã thông báo xác thực Firebase cũ, bạn nên cập nhật phương thức xác thực REST thành một trong các phương thức xác thực được mô tả ở trên.

API REST Realtime Database vẫn hỗ trợ xác thực thông qua mã thông báo xác thực cũ, bao gồm cả thông tin bí mật. Bạn có thể tìm thấy thông tin bí mật của Realtime Database trong phần Tài khoản dịch vụ của bảng điều khiển Firebase.

Thông tin bí mật là thông tin đăng nhập có thời gian tồn tại lâu dài. Bạn nên tạo một thông tin bí mật mới và thu hồi thông tin bí mật hiện có khi xoá người dùng có quyền truy cập bí mật (chẳng hạn như chủ sở hữu) khỏi một dự án.