Triển khai tới trang web của bạn bằng API Hosting REST

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

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

Ví dụ: với API REST của dịch vụ lưu trữ Firebase, 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 định kỳ, bạn có thể thay đổi nội dung được lưu trữ trên Firebase theo lịch trình thường xuyên (ví dụ: để triển khai phiên bản nội dung liên quan đến sự kiện hoặc ngày lễ đặc biệt).

  • 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 tùy chọn trong công cụ của mình để triển khai các dự án ứng dụng web lên Firebase Hosting chỉ bằng một cú nhấp chuột (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 ra 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 một bài báo), bạn có thể triển khai nội dung được tạo dưới dạng tệp tĩnh thay vì phân phát chúng một cách linh hoạt. Điều này giúp bạn tiết kiệm năng lượng tính toán đắt tiền và phục vụ các tệp của bạn theo cách có thể 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à ủy quyền API. Sau đó, hướng dẫn này sẽ trình bày một ví dụ để tạo phiên bản Firebase Hosting, tải các tệp cần thiết lên phiên bản, sau đó 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 đầy đủ về API REST của Hosting .

Trước khi bạn bắt đầu: Kích hoạt API REST

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

  1. Mở trang API lưu trữ Firebase trong bảng điều khiển API của Google.

  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 lưu trữ Firebase.

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

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

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

Để tạo tệp khóa riêng cho tài khoản dịch vụ của bạn:

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

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

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

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

nút.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 khách Google API xác thực yêu cầu bằng mã thông báo web JSON hoặc JWT. Để biết thêm thông tin, hãy xem 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ã thông báo 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ã thông báo truy cập đã cập nhật.

Bước 2: Đảm bảo rằng dự án của bạn có trang web Lưu trữ mặc định

Trước khi triển khai lần đầu tiên lên Dịch vụ lưu trữ Firebase, dự án Firebase của bạn phải có SITE Lưu trữ mặc định .

  1. Kiểm tra xem dự án của bạn đã có trang web Lưu trữ 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 Lưu trữ 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 Lưu trữ mặc định. Hoàn thành phần còn lại của bước này.

  2. Quyết định SITE_ID cho trang web Lưu trữ mặc định của bạn. Hãy ghi nhớ những điều sau khi quyết định SITE_ID này :

    • SITE_ID này được sử dụng để tạo tên miền phụ Firebase mặc định của bạn:
      SITE_ID .web.app SITE_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à nó không thể chứa . , _ , vân vân.
      • Phải có 30 ký tự trở xuống
      • Phải là duy nhất trên toàn cầu trong Firebase

    Lưu ý rằng chúng tôi thường khuyên bạn nên sử dụng ID dự án làm SITE_ID cho trang web Lưu trữ mặc định của mình. Tìm hiểu cách tìm ID này trong Tìm hiểu dự án Firebase .

  3. Tạo trang web Lưu trữ mặc định của bạn bằng cách gọi điểm cuối sites.create bằng cách sử dụng SITE_ID mà bạn 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 tới sites.create này 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

Cuộc gọi API đầu tiên của bạn là tạo Version mới cho trang web của bạn. Ở phần sau của hướng dẫn này, bạn sẽ tải tệp lên phiên bản này, sau đó triển khai nó lên 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ốiversions.create bằng cách sử dụng SITE_ID của bạn trong cuộc gọi.

    (Tùy chọn) Bạn cũng có thể chuyển đối tượng cấu hình Firebase Hosting trong cuộc gọi, bao gồm cả việc đặt tiêu đề lưu trữ 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 tới versions.create này 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ã định danh duy nhất cho phiên bản mới, ở định dạng: sites/ SITE_ID /versions/ VERSION_ID . Bạn sẽ cần mã định danh duy nhất này trong suốt hướng dẫn này để tham khảo phiên bản cụ thể này.

Bước 4: Chỉ định danh sách file muốn triển khai

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

Lưu ý rằng Hosting có giới hạn kích thước tối đa là 2 GB cho từng file riêng lẻ.

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 Gzipping các tệp, sau đó lấy hàm băm SHA256 của mỗi tệp mới được nén.

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

  1. Gzip các tập tin:

    gzip file1 && gzip file2 && gzip file3

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

  2. Lấy hàm băm SHA256 của mỗi 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 ba giá trị băm này trong một yêu cầu API tới điểm versions.populateFiles . Liệt kê từng hàm băm theo đường dẫn mong muốn cho tệp được 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 versions.populateFiles này 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 mỗi tệp cần được tải lên. Ví dụ: trong ví dụ này, file1 đã được tải lên ở phiên bản trước, do đó hàm băm của nó không được đưa vào 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 giá trị băm và uploadURL từ phản versions.populateFiles .

Bước 5: Tải lên các tập tin cần thiết

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

  1. Nối dấu gạch chéo lênhàm băm của tệp vào uploadUrl để tạo 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 được yêu cầu lên (trong ví dụ này chỉ file2.gzfile3.gz ) lên URL dành riêng cho tệp bằng cách sử dụng một loạt yêu cầu.

    Ví dụ: để tải lên file2.gz đã né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
    

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 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 versions.populateFiles , bạn có thể cập nhật trạng thái phiên bản của mình thành FINALIZED .

Gọi điểm versions.patch với trường status trong yêu cầu API của bạn đượ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 tới versions.patch này trả về JSON sau. Kiểm tra xem 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 nó để triển khai. Đối với bước này, bạn cần tạo Release phiên bản 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 của bạn.

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

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 tới releases.create này 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 bây giờ sẽ được triển khai vào trang web của bạn và bạn có thể truy cập các tệp của mình bằng URL:

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

Những tệp này cũng có thể truy cập được trên các URL được liên kết với miền SITE_ID .firebaseapp.com của bạn.

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