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

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

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

  1. Mã truy cập OAuth2 của Google – Thông thường, khả năng đọc từ và ghi vào Cơ sở dữ liệu theo thời gian thực chịu sự điều chỉnh của Quy tắc về cơ sở dữ liệu theo thời gian thự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 đọc và ghi đầy đủ vào dữ liệu của bạn dữ liệu có 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 ID Firebase - Bạn cũng có thể muốn gửi các yêu cầu đã xác thực với tư cách người dùng cá nhân, chẳng hạn như giới hạn quyền truy cập bằng Quy tắc cơ sở dữ liệu theo thời gian thực trên các SDK ứng dụng khách. API REST chấp nhận cùng mã thông báo mã nhận dạng Firebase được các SDK ứng dụng khách.

Mã truy cập OAuth2 của Google

Bất kỳ dữ liệu nào có thể đọc công khai hoặc ghi được theo Quy tắc cơ sở dữ liệu theo thời gian thực cũng dễ đọc và có thể ghi qua API REST mà không cần xác thực. Tuy nhiên, nếu muốn máy chủ của mình để bỏ qua Quy tắc cơ sở dữ liệu theo thời gian thực, bạn cần xác thực quyền đọc và ghi của mình yêu cầu. Để xác thực thông qua Google OAuth2, bạn cần thực hiện 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 của cơ sở dữ liệu theo thời gian thực chấp nhận chuẩn Mã truy cập OAuth2 của Google. Bạn có thể tạo mã truy cập bằng tài khoản dịch vụ có quyền truy cập vào Cơ sở dữ liệu theo thời gian thực của mình. Nhấp vào nút Tạo riêng tư mới Key ở cuối Tài khoản dịch vụ của bảng điều khiển Firebase giúp bạn dễ dàng tạo một dịch vụ mới nếu bạn chưa có tệp khoá tài khoản.

Sau khi có tệp khoá tài khoản dịch vụ, bạn có thể sử dụng một trong 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 cách tạo Google OAuth2 mã truy cập để xác thực với Realtime Database REST API bằng nhiều ngôn ngữ:

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 google-auth thư viện:

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 cơ sở dữ liệu theo thời gian thực, hãy chuyển Mã truy cập Google OAuth2 được tạo ở trên dưới dạng Tiêu đề Authorization: Bearer <ACCESS_TOKEN> hoặc Tham số chuỗi truy vấn access_token=<ACCESS_TOKEN>. Dưới đây là ví dụ về curl yêu cầu đọ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 Cơ sở dữ liệu theo thời gian thực và <ACCESS_TOKEN> với mã truy cập OAuth2 của Google.

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

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

Mã thông báo mã Firebase

Khi người dùng hoặc thiết bị đăng nhập bằng tính năng Xác thực Firebase, Firebase sẽ tạo một mã thông báo ID tương ứng xác định duy nhất các trang web và cấp cho chúng quyền truy cập vào một số tài nguyên, chẳng hạn như Cơ sở dữ liệu theo thời gian thực và Cloud Storage. Bạn có thể dùng lại mã thông báo mã nhận dạng đó để xác thực API REST của cơ sở dữ liệu theo thời gian thực và đưa ra yêu cầu cho người dùng đó.

Tạo mã thông báo giá trị nhận dạng

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

Xin lưu ý rằng mã thông báo mã nhận dạng sẽ hết hạn sau một khoảng thời gian ngắn nên bạn cần dùng mã này nhanh nhất có thể sau khi truy xuất chúng.

Xác thực bằng mã thông báo mã nhận dạng

Để gửi các yêu cầu đã xác thực đến API REST của cơ sở dữ liệu theo thời gian thực, hãy chuyển Mã thông báo mã nhận dạng được tạo ở trên dưới dạng tham số chuỗi truy vấn auth=<ID_TOKEN>. Ở đây là một yêu cầu curl mẫu để đọc tên 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 Cơ sở dữ liệu theo thời gian thực và <ID_TOKEN> với mã thông báo mã Firebase.

Yêu cầu thành công sẽ được biểu thị bằng mã trạng thái HTTP 200 OK. Chiến lược phát hành đĩa đơn 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 của cơ sở dữ liệu theo thời gian thực vẫn hỗ trợ xác thực thông qua chế độ cũ mã xác thực, bao gồm cả bí mật. Bạn có thể tìm thấy các bí mật cho Cơ sở dữ liệu theo thời gian thực của bạn trong thời gian Tài khoản dịch vụ của bảng điều khiển của Firebase.

Thông tin bí mật là thông tin đăng nhập tồn tại trong thời gian dài. Bạn nên tạo một khoá bí mật mới và thu hồi dữ liệu 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.