Triển khai cho trang web của bạn bằng API REST của máy chủ lưu trữ

API REST Firebase Hosting cho phép triển khai theo phương thức lập trình và có thể tuỳ chỉnh cho các trang web được lưu trữ trên Firebase. Sử dụng API REST này để triển khai nội dung và cấu hình Hosting mới hoặc đã cập nhật.

Thay vì sử dụng Firebase CLI để triển khai, bạn có thể sử dụng API REST Firebase Hosting để tạo một version mới của tài sản cho trang web của mình theo phương thức lập trình, tải tệp lên phiên bản, sau đó triển khai phiên bản đó cho trang web.

Ví dụ: với API REST Firebase Hosting, bạn có thể:

  • Lên lịch triển khai. Bằng cách sử dụng API REST kết hợp với công việc cron, bạn có thể thay đổi nội dung do Firebase lưu trữ theo lịch trình thông thường (ví dụ: để triển khai phiên bản nội dung đặc biệt liên quan đến ngày lễ hoặc sự kiện).

  • Tích hợp với các công cụ dành cho nhà phát triển. Bạn có thể tạo một tuỳ chọn trong công cụ của mình để triển khai các dự án ứng dụng web đến Firebase Hosting chỉ bằng một lần nhấp (ví dụ: nhấp vào nút triển khai trong IDE).

  • Tự động triển khai khi nội dung tĩnh được tạo. Khi một quy trình tạo nội dung tĩnh theo phương thức lập trình (ví dụ: nội dung do người dùng tạo như wiki hoặc bài viết tin tức), bạn có thể triển khai nội dung đã tạo dưới dạng tệp tĩnh thay vì phân phát nội dung đó một cách linh động. Điều này giúp bạn tiết kiệm điện năng tính toán tốn kém và phân phát tệp theo cách linh hoạt hơn.

Trước tiên, hướng dẫn này mô tả cách bật, xác thực và uỷ quyền cho API. Sau đó, hướng dẫn này sẽ hướng dẫn bạn một ví dụ về cách tạo phiên bản Firebase Hosting, tải các tệp bắt buộc lên phiên bản đó, rồi triển khai phiên bản.

Bạn cũng có thể tìm hiểu thêm về API REST này trong tài liệu tham khảo đầy đủ về API REST Hosting.

Trước khi bắt đầu: Bật API REST

Bạn phải bật API REST Firebase Hosting trong Google API Console:

  1. Mở trang API Firebase Hosting trong Google API Console.

  2. Khi được nhắc, hãy chọn dự án Firebase của bạn.

  3. Nhấp vào Bật trên trang API Firebase Hosting.

Bước 1: Lấy mã thông báo truy cập để xác thực và uỷ quyền cho các yêu cầu API

Các dự án Firebase hỗ trợ tài khoản dịch vụ của Google. Bạn có thể sử dụng tài khoản này để gọi API máy chủ Firebase từ máy chủ ứng dụng hoặc môi trường đáng tin cậy. Nếu đang phát triển mã cục bộ hoặc triển khai ứng dụng tại chỗ, bạn có thể sử dụng thông tin xác thực thu được thông qua tài khoản dịch vụ này để uỷ quyền cho các yêu cầu máy chủ.

Để xác thực tài khoản dịch vụ và uỷ quyền cho tài khoản đó truy cập vào các dịch vụ của Firebase, bạn phải tạo một tệp khoá riêng tư ở định dạng JSON.

Cách tạo tệp khoá riêng tư cho tài khoản dịch vụ:

  1. Trong bảng điều khiển Firebase, hãy mở Settings (Cài đặt) > Service Accounts (Tài khoản dịch vụ).

  2. Nhấp vào Tạo khoá riêng tư mới, rồi xác nhận bằng cách nhấp vào Tạo khoá.

  3. Lưu trữ an toàn tệp JSON chứa khoá.

Sử dụng thông tin xác thực Firebase cùng với Thư viện xác thực của Google cho ngôn ngữ bạn muốn để truy xuất mã truy cập OAuth 2.0 có thời hạn ngắn:

node.js

const {google} = require('googleapis');
function getAccessToken() {
  return new Promise(function(resolve, reject) {
    var key = require('./service-account.json');
    var jwtClient = new google.auth.JWT(
      key.client_email,
      null,
      key.private_key,
      SCOPES,
      null
    );
    jwtClient.authorize(function(err, tokens) {
      if (err) {
        reject(err);
        return;
      }
      resolve(tokens.access_token);
    });
  });
}

Trong ví dụ này, thư viện ứng dụng API của Google xác thực yêu cầu bằng mã thông báo web JSON (JWT). Để biết thêm thông tin, hãy xem bài viết Mã thông báo web JSON.

Python

def _get_access_token():
  """Retrieve a valid access token that can be used to authorize requests.

  :return: Access token.
  """
  credentials = ServiceAccountCredentials.from_json_keyfile_name(
      'service-account.json', SCOPES)
  access_token_info = credentials.get_access_token()
  return access_token_info.access_token

Java

private static String getAccessToken() throws IOException {
  GoogleCredential googleCredential = GoogleCredential
      .fromStream(new FileInputStream("service-account.json"))
      .createScoped(Arrays.asList(SCOPES));
  googleCredential.refreshToken();
  return googleCredential.getAccessToken();
}

Sau khi mã truy cập của bạn hết hạn, phương thức làm mới mã thông báo sẽ được gọi tự động để truy xuất mã truy cập đã cập nhật.

Bước 2: Đảm bảo dự án của bạn có trang web Hosting mặc định

Trước khi triển khai lần đầu tiên vào Firebase Hosting, dự án Firebase của bạn phải có Hosting SITE mặc định.

  1. Kiểm tra xem dự án của bạn đã có trang web Hosting mặc định hay chưa bằng cách gọi điểm cuối sites.list.

    Ví dụ:

    Lệnh cURL

    curl -H "Content-Type: application/json" \
           -H "Authorization: Bearer ACCESS_TOKEN" \
    
    https://firebasehosting.googleapis.com/v1beta1/projects/PROJECT_ID/sites
    

    Yêu cầu HTTPS thô

    Host: firebasehosting.googleapis.com
    
    POST /v1beta1/projects/PROJECT_ID/sites HTTP/1.1
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/json
    • Nếu một trong các trang web có "type": "DEFAULT_SITE", thì dự án của bạn đã có trang web Hosting mặc định. Bỏ qua phần còn lại của bước này rồi chuyển sang bước tiếp theo: Tạo phiên bản mới cho trang web của bạn.

    • Nếu bạn nhận được một mảng trống, thì tức là bạn không có trang web Hosting mặc định. Hoàn tất phần còn lại của bước này.

  2. Quyết định SITE_ID cho trang web Hosting mặc định. Hãy lưu ý những điều sau khi quyết định SITE_ID này:

    • SITE_ID này được dùng để tạo các miền con Firebase mặc định:
      SITE_ID.web.appSITE_ID.firebaseapp.com.

    • SITE_ID có các yêu cầu sau:

      • Phải là nhãn tên máy chủ hợp lệ, nghĩa là không được chứa ., _, v.v.
      • Không được vượt quá 30 ký tự
      • Phải là duy nhất trên toàn hệ thống trong Firebase

    Xin lưu ý rằng bạn nên sử dụng mã dự án làm SITE_ID cho trang web Hosting mặc định. Tìm hiểu cách tìm mã nhận dạng này trong bài viết Tìm hiểu về các dự án Firebase.

  3. Tạo trang web Hosting mặc định bằng cách gọi điểm cuối sites.create bằng cách sử dụng SITE_ID mong muốn làm tham số siteId.

    Ví dụ:

    Lệnh cURL

    curl -H "Content-Type: application/json" \
           -H "Authorization: Bearer ACCESS_TOKEN" \
    
    https://firebasehosting.googleapis.com/v1beta1/projects/PROJECT_ID/sites?siteId=SITE_ID
    

    Yêu cầu HTTPS thô

    Host: firebasehosting.googleapis.com
    
    POST /v1beta1/projects/PROJECT_ID/sites?siteId=SITE_ID
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/json

    Lệnh gọi API này đến sites.create trả về JSON sau:

    {
      "name": "projects/PROJECT_ID/sites/SITE_ID",
      "defaultUrl": "https://SITE_ID.web.app",
      "type": "DEFAULT_SITE"
    }

Bước 3: Tạo phiên bản mới cho trang web

Lệnh gọi API đầu tiên của bạn là tạo một Version mới cho trang web của bạn. Trong phần sau của hướng dẫn này, bạn sẽ tải các tệp lên phiên bản này, sau đó triển khai phiên bản đó cho trang web của mình.

  1. Xác định SITE_ID cho trang web mà bạn muốn triển khai.

  2. Gọi điểm cuối versions.create bằng SITE_ID trong lệnh gọi.

    (Không bắt buộc) Bạn cũng có thể truyền một đối tượng cấu hình Firebase Hosting trong lệnh gọi, bao gồm cả việc đặt tiêu đề lưu tất cả tệp vào bộ nhớ đệm trong một khoảng thời gian cụ thể.

    Ví dụ:

    Lệnh cURL

    curl -H "Content-Type: application/json" \
           -H "Authorization: Bearer ACCESS_TOKEN" \
           -d '{
                 "config": {
                   "headers": [{
                     "glob": "**",
                     "headers": {
                       "Cache-Control": "max-age=1800"
                     }
                   }]
                 }
               }' \
    https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/versions
    

    Yêu cầu HTTPS thô

    Host: firebasehosting.googleapis.com
    
    POST /v1beta1/sites/SITE_ID/versions HTTP/1.1
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/json
    Content-Length: 134
    
    {
      "config": {
        "headers": [{
          "glob": "**",
          "headers": {
            "Cache-Control": "max-age=1800"
          }
        }]
      }
    }

Lệnh gọi API này đến versions.create trả về JSON sau:

{
  "name": "sites/SITE_ID/versions/VERSION_ID",
  "status": "CREATED",
  "config": {
    "headers": [{
      "glob": "**",
      "headers": {
        "Cache-Control": "max-age=1800"
      }
    }]
  }
}

Nội dung phản hồi này chứa một giá trị nhận dạng duy nhất cho phiên bản mới, ở định dạng: sites/SITE_ID/versions/VERSION_ID. Bạn sẽ cần giá trị nhận dạng duy nhất này trong suốt hướng dẫn này để tham chiếu đến phiên bản cụ thể này.

Bước 4: Chỉ định danh sách tệp bạn muốn triển khai

Giờ đây, khi đã có giá trị nhận dạng phiên bản mới, bạn cần cho Firebase Hosting biết những tệp mà bạn muốn triển khai trong phiên bản mới này.

Xin lưu ý rằng Hosting có giới hạn kích thước tối đa là 2 GB đối với từng tệp.

API này yêu cầu bạn xác định tệp bằng hàm băm SHA256. Vì vậy, trước khi có thể thực hiện lệnh gọi API, trước tiên, bạn cần tính toán hàm băm cho từng tệp tĩnh bằng cách nén các tệp đó bằng Gzip, sau đó lấy hàm băm SHA256 của từng tệp mới nén.

Tiếp tục ví dụ, giả sử bạn muốn triển khai 3 tệp trong phiên bản mới: file1, file2file3.

  1. Nén tệp:

    gzip file1 && gzip file2 && gzip file3

    Bây giờ, bạn có 3 tệp nén file1.gz, file2.gzfile3.gz.

  2. Lấy hàm băm SHA256 của từng tệp nén:

    cat file1.gz | openssl dgst -sha256
    
    66d61f86bb684d0e35f94461c1f9cf4f07a4bb3407bfbd80e518bd44368ff8f4
    
    cat file2.gz | openssl dgst -sha256
    
    490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083
    
    cat file3.gz | openssl dgst -sha256
    
    59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315
    

    Bây giờ, bạn có ba hàm băm SHA256 của ba tệp nén.

  3. Gửi 3 hàm băm này trong một yêu cầu API đến điểm cuối versions.populateFiles. Liệt kê từng hàm băm theo đường dẫn mong muốn cho tệp đã tải lên (trong ví dụ này là /file1, /file2/file3).

    Ví dụ:

    Lệnh cURL

    $ curl -H "Content-Type: application/json" \
             -H "Authorization: Bearer ACCESS_TOKEN" \
             -d '{
                   "files": {
                     "/file1": "66d61f86bb684d0e35f94461c1f9cf4f07a4bb3407bfbd80e518bd44368ff8f4",
                     "/file2": "490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083",
                     "/file3": "59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315"
                   }
                 }' \
    https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/versions/VERSION_ID:populateFiles
    

    Yêu cầu HTTPS thô

    Host: firebasehosting.googleapis.com
    
    POST /v1beta1/sites/SITE_ID/versions/VERSION_ID:populateFiles HTTP/1.1
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/json
    Content-Length: 181
    
    {
      "files": {
        "/file1": "66d61f86bb684d0e35f94461c1f9cf4f07a4bb3407bfbd80e518bd44368ff8f4",
        "/file2": "490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083",
        "/file3": "59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315"
      }
    }

Lệnh gọi API này đến versions.populateFiles trả về JSON sau:

{
  "uploadRequiredHashes": [
    "490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083",
    "59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315"
  ],
  "uploadUrl": "https://upload-firebasehosting.googleapis.com/upload/sites/SITE_ID/versions/VERSION_ID/files"
}

Nội dung phản hồi này bao gồm:

  • Hash của từng tệp cần tải lên. Ví dụ: trong ví dụ này, file1 đã được tải lên trong một phiên bản trước, vì vậy, hàm băm của tệp này không có trong danh sách uploadRequiredHashes.

  • uploadUrl dành riêng cho phiên bản mới.

Trong bước tiếp theo để tải hai tệp mới lên, bạn sẽ cần hàm băm và uploadURL từ phản hồi versions.populateFiles.

Bước 5: Tải các tệp bắt buộc lên

Bạn cần tải từng tệp bắt buộc lên (những tệp được liệt kê trong uploadRequiredHashes từ phản hồi versions.populateFiles ở bước trước). Đối với các lần tải tệp lên này, bạn sẽ cần hàm băm tệp và uploadUrl từ bước trước.

  1. Thêm dấu gạch chéo lênhàm băm của tệp vào uploadUrl để tạo một URL dành riêng cho tệp theo định dạng: https://upload-firebasehosting.googleapis.com/upload/sites/SITE_ID/versions/VERSION_ID/files/FILE_HASH.

  2. Tải từng tệp bắt buộc lên (trong ví dụ này, chỉ có file2.gzfile3.gz) vào URL dành riêng cho tệp bằng một loạt yêu cầu.

    Ví dụ: để tải file2.gz nén lên:

    Lệnh cURL

    curl -H "Authorization: Bearer ACCESS_TOKEN" \
           -H "Content-Type: application/octet-stream" \
           --data-binary @./file2.gz \
    https://upload-firebasehosting.googleapis.com/upload/sites/SITE_ID/versions/VERSION_ID/files/FILE_HASH
    

    Yêu cầu HTTPS thô

    Host: upload-firebasehosting.googleapis.com
    
    POST /upload/sites/SITE_ID/versions/VERSION_ID/files/FILE_HASH HTTP/1.1
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/octet-stream
    Content-Length: 500
    
    content-of-file2.gz

Các lần tải lên thành công sẽ trả về phản hồi HTTPS 200 OK.

Bước 6: Cập nhật trạng thái của phiên bản thành ĐÃ HOÀN TẤT

Sau khi tải tất cả tệp được liệt kê trong phản hồi versions.populateFiles lên, bạn có thể cập nhật trạng thái của phiên bản thành FINALIZED.

Gọi điểm cuối versions.patch với trường status trong yêu cầu API được đặt thành FINALIZED.

Ví dụ:

Lệnh cURL

curl -H "Content-Type: application/json" \
       -H "Authorization: Bearer ACCESS_TOKEN" \
       -X PATCH \
       -d '{"status": "FINALIZED"}' \
https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/versions/VERSION_ID?update_mask=status

Yêu cầu HTTPS thô

Host: firebasehosting.googleapis.com

PATCH /v1beta1/sites/SITE_ID/versions/VERSION_ID?update_mask=status HTTP/1.1
Authorization: Bearer ACCESS_TOKEN
Content-Type: application/json
Content-Length: 23

{"status": "FINALIZED"}

Lệnh gọi API này đến versions.patch sẽ trả về JSON sau. Kiểm tra để đảm bảo rằng status đã được cập nhật lên FINALIZED.

{
  "name": "sites/SITE_ID/versions/VERSION_ID",
  "status": "FINALIZED",
  "config": {
    "headers": [{
      "glob": "**",
      "headers": {"Cache-Control": "max-age=1800"}
    }]
  },
  "createTime": "2018-12-02T13:41:56.905743Z",
  "createUser": {
    "email": "SERVICE_ACCOUNT_EMAIL@SITE_ID.iam.gserviceaccount.com"
  },
  "finalizeTime": "2018-12-02T14:56:13.047423Z",
  "finalizeUser": {
    "email": "USER_EMAIL@DOMAIN.tld"
  },
  "fileCount": "5",
  "versionBytes": "114951"
}

Bước 7: Phát hành phiên bản để triển khai

Bây giờ, bạn đã có một phiên bản hoàn thiện, hãy phát hành phiên bản đó để triển khai. Ở bước này, bạn cần tạo một Release của phiên bản chứa cấu hình lưu trữ và tất cả tệp nội dung cho phiên bản mới.

Gọi điểm cuối releases.create để tạo bản phát hành.

Ví dụ:

Lệnh cURL

curl -H "Authorization: Bearer ACCESS_TOKEN" \
       -X POST
https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/releases?versionName=sites/SITE_ID/versions/VERSION_ID

Yêu cầu HTTPS thô

Host: firebasehosting.googleapis.com

POST /v1beta1/sites/SITE_ID/releases?versionName=sites/SITE_ID/versions/VERSION_ID HTTP/1.1
Authorization: Bearer ACCESS_TOKEN

Lệnh gọi API này đến releases.create trả về JSON sau:

{
  "name": "sites/SITE_ID/releases/RELEASE_ID",
  "version": {
    "name": "sites/SITE_ID/versions/VERSION_ID",
    "status": "FINALIZED",
    "config": {
    "headers": [{
      "glob": "**",
      "headers": {"Cache-Control": "max-age=1800"}
    }]
  }
  },
  "type": "DEPLOY",
  "releaseTime": "2018-12-02T15:14:37Z"
}

Cấu hình lưu trữ và tất cả tệp cho phiên bản mới hiện đã được triển khai trên trang web của bạn và bạn có thể truy cập vào các tệp của mình bằng các URL sau:

  • https://SITE_ID.web.app/file1
  • https://SITE_ID.web.app/file2
  • https://SITE_ID.web.app/file3

Bạn cũng có thể truy cập vào các tệp này trên URL liên kết với miền SITE_ID.firebaseapp.com.

Bạn cũng có thể thấy bản phát hành mới của mình được liệt kê trong trang tổng quan Hosting của bảng điều khiển Firebase.