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

SDK Firebase thay mặt bạn xử lý tất cả quá trình xác thực và liên lạc với Cơ sở dữ liệu thời gian thực Firebase. Tuy nhiên, khi bạn ở trong môi trường không có SDK khách hoặc muốn tránh chi phí kết nối cơ sở dữ liệu liên tục, bạn có thể sử dụng API REST của cơ sở dữ liệu 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ã thông báo truy cập Google OAuth2 - Thông thường, khả năng đọc và ghi vào Cơ sở dữ liệu thời gian thực được điều chỉnh bởi Quy tắc cơ sở dữ liệu thời gian thực . Tuy nhiên, bạn có thể truy cập dữ liệu của mình từ máy chủ và cấp cho máy chủ đó quyền truy cập đọc và ghi đầy đủ vào dữ liệu của bạn bằng mã thông báo truy cập Google OAuth2 được tạo 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 yêu cầu được xác thực với tư cách là một người dùng cá nhân, như giới hạn quyền truy cập bằng Quy tắc cơ sở dữ liệu thời gian thực trên SDK khách. API REST chấp nhận cùng mã thông báo ID Firebase được SDK khách sử dụng.

Mã thông báo truy cập Google OAuth2

Bất kỳ dữ liệu nào có thể đọc hoặc ghi công khai theo Quy tắc cơ sở dữ liệu thời gian thực của bạn cũng có thể đọc và ghi được thông qua API REST mà không cần bất kỳ xác thực nào. Tuy nhiên, nếu bạn muốn máy chủ của mình bỏ qua Quy tắc cơ sở dữ liệu thời gian thực, bạn cần xác thực các yêu cầu đọc và ghi của mình. Xác thực thông qua Google OAuth2 yêu cầu các bước sau:

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

Tạo mã thông báo truy cập

API REST cơ sở dữ liệu thời gian thực chấp nhận mã thông báo truy cập Google OAuth2 tiêu chuẩn. Mã thông báo truy cập có thể được tạo bằng tài khoản dịch vụ có quyền thích hợp đối với Cơ sở dữ liệu thời gian thực của bạn. Nhấp vào nút Tạo khóa riêng mới ở cuối phần Tài khoản dịch vụ của bảng điều khiển Firebase cho phép bạn dễ dàng tạo tệp khóa tài khoản dịch vụ mới nếu bạn chưa có.

Sau khi có tệp khóa 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 khách Google API để tạo mã thông báo 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ố cách triển khai mẫu cho thấy cách tạo mã thông báo truy cập Google OAuth2 để xác thực với API REST của cơ sở dữ liệu thời gian thực bằng nhiều ngôn ngữ:

Node.js

Sử dụng Thư viện ứng dụng khách 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 khách API của Google dành 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ã thông báo truy cập

Để gửi các yêu cầu đã xác thực tới API REST của cơ sở dữ liệu thời gian thực, hãy chuyển mã thông báo 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à một ví dụ 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>"

Đảm bảo thay thế <DATABASE_NAME> bằng tên Cơ sở dữ liệu thời gian thực của bạn và <ACCESS_TOKEN> bằng mã thông báo 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 ID Firebase

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

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

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

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à phải được sử dụng càng nhanh càng tốt sau khi truy xuất chúng.

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

Để gửi các yêu cầu đã xác thực tới API REST của cơ sở dữ liệu thời gian thực, hãy chuyể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> . Đây là một ví dụ curl yêu cầu đọc tên của Ada:

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

Đảm bảo thay thế <DATABASE_NAME> bằng tên Cơ sở dữ liệu thời gian thực của bạn và <ID_TOKEN> bằng mã thông báo ID Firebase.

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 kế thừa

Nếu bạn vẫn đang sử dụng mã thông báo xác thực Firebase cũ, chúng tôi khuyên bạn nên cập nhật xác thực REST của mình bằng 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 thời gian thực 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ả bí mật . Bạn có thể tìm thấy bí mật Cơ sở dữ liệu thời gian thực của mình trong phần Tài khoản dịch vụ của bảng điều khiển Firebase.

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