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 đang ở trong một môi trường không có SDK ứng dụng hoặc muốn tránh hao tổn kết nối cơ sở dữ liệu liên tục, bạn có thể sử dụng API REST Realtime Database để đọ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 OAuth2 của Google – Thông thường, khả năng đọc và ghi vào Realtime Database được điều chỉnh theo Quy tắc Realtime Database. 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ủ đó toàn quyền đọc và ghi vào dữ liệu của bạn bằng mã truy cập OAuth2 của Google được tạo từ một tài khoản dịch vụ.

  2. Mã thông báo mã Firebase – Bạn cũng có thể gửi các yêu cầu được xác thực là 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 Realtime Database trên SDK ứng dụng. API REST chấp nhận cùng một mã thông báo mã nhận dạng Firebase mà SDK ứng dụng sử dụng.

Mã truy cập OAuth2 của Google

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

  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 OAuth2 của Google tiêu chuẩn. Bạn có thể tạo mã thông báo truy cập bằng một tài khoản dịch vụ có các quyền thích hợp đối với Realtime Database. Khi nhấp vào nút Tạo khoá riêng 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 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 OAuth2 của Google 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

Sau đây là một số ví dụ về cách triển khai 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 Realtime Database 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 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 Realtime Database, hãy truyền mã truy cập OAuth2 của Google đượ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ề yêu cầu curl để đọc tên 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 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. Phản hồi chứa dữ liệu đang được truy xuất:

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

Mã thông báo mã nhận dạng Firebase

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 nhận dạng tương ứng giúp 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 nhận dạng đó để xác thực API REST Realtime Database và đưa ra yêu cầu thay mặt cho người dùng đó.

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

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

Xin lưu ý rằng mã thông báo nhận dạng 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 nhanh nhất có thể sau khi truy xuất.

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

Để 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 nhận dạng đượ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 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. 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ã 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 các 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 các khoá bí mật 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 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 khoá bí mật hiện có khi xoá người dùng có quyền truy cập vào khoá bí mật (chẳng hạn như chủ sở hữu) khỏi một dự án.