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

API REST của Firebase HostingFirebase Hosting cho phép triển khai theo chương trình và tuỳ chỉnh vào các trang web do Firebase lưu trữ. Hãy sử dụng API REST này để triển khai nội dung Hosting mới hoặc đã cập nhật và cấu hình.

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

Ví dụ: với API REST của 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 một 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 xuyên (ví dụ: để triển khai phiên bản đặc biệt liên quan đến ngày lễ hoặc sự kiện của nội dung).

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

  • Tự động hoá việc 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 chương 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 hoạt. Điều này giúp bạn tiết kiệm sức mạnh tính toán tốn kém và phân phát tệp theo cách có khả năng mở rộng hơn.

Hướng dẫn này trước tiên mô tả cách bật, xác thực và cấp quyền cho API. Sau đó, hướng dẫn này sẽ trình bày một ví dụ về cách tạo Firebase Hosting phiên bản, tải các tệp bắt buộc lên phiên bản đó, rồi cuối cùng là 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 về API REST đầy đủ Hosting.

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

Bạn phải bật API REST của Firebase Hosting trong bảng điều khiển Google API:

  1. Mở trang API trong bảng điều khiển Google API.Firebase Hosting

  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ã truy cập để xác thực và cấp 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 các 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 đăng nhập nhận được bằng tài khoản dịch vụ này để cấp quyền cho các yêu cầu của máy chủ.

Bạn có thể xem tất cả tài khoản dịch vụ cho dự án Firebase của mình trong Cài đặt > Tài khoản dịch vụ tab.

Để xác thực một tài khoản dịch vụ và cấp 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 chuyển đến phần Cài đặt > thẻ Tài khoản dịch vụ.

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

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

Sử dụng thông tin đăng nhập 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 cho trang web theo chuẩn JSON (JWT). Để biết thêm thông tin, hãy xem bài viết Mã thông báo cho trang web theo chuẩn 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ẽ tự động được gọi để truy xuất mã truy cập đã cập nhật.

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

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

  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ó một trang web Hosting mặc định. Bỏ qua phần còn lại của bước này, và 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ì 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 của bạn. 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 phụ 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 cầu trong Firebase

    Xin lưu ý rằng bạn nên sử dụng mã dự án làm SITE_ID cho trang web mặc định Hosting. Tìm hiểu cách tìm mã này trong 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 SITE_ID mà bạn 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 sẽ 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 của bạn

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

  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 đố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 vào bộ nhớ đệm tất cả các tệp trong một khoảng thời gian được chỉ định.

    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 sẽ trả về JSON sau:

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

Phản hồi này chứa một giá trị nhận dạng riêng biệ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 riêng biệ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 các tệp bạn muốn triển khai

Bây giờ bạn đã 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 cho 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 Gzip các tệp, sau đó lấy hàm băm SHA256 của từng tệp mới nén.

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

  1. Gzip các 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ó 3 hàm băm SHA256 của 3 tệp nén.

  3. Gửi 3 hàm băm này trong 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, /file1, /file2, và /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 sẽ trả về JSON sau:

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

Phản hồi này bao gồm:

  • Hàm băm của từng tệp cần được tải lên. Ví dụ: trong ví dụ này, file1 đã được tải lên trong phiên bản trước, vì vậy, hàm băm của tệp đó 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 2 tệp mới lên, bạn sẽ cần các 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 tệp tải lên này, bạn sẽ cần các hàm băm tệp và uploadUrl từ bước trước.

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

  2. Tải tất cả các tệp bắt buộc lên từng tệp một (trong ví dụ này, chỉ 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 tệp 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ượt 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 FINALIZED

Sau khi tải lên tất cả các tệp được liệt kê trong phản hồi versions.populateFiles, 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 status đã được cập nhật thành 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ó phiên bản hoàn thiện, hãy phát hành phiên bản đó để triển khai. Đối với bước này, bạn cần tạo Release cho phiên bản của mình có chứa cấu hình lưu trữ và tất cả các tệp nội dung cho phiên bản mới.

Gọi releases.create điểm cuối để 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 sẽ 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ả các tệp cho phiên bản mới sẽ được triển khai vào trang web của bạn và bạn có thể truy cập vào các tệp bằng URL:

  • 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 được liên kết với miền của bạn SITE_ID.firebaseapp.com.

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