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:
Mở trang API trong bảng điều khiển Google API.Firebase Hosting
Khi được nhắc, hãy chọn dự án Firebase của bạn.
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
Để 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ụ:
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ụ.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á.
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.
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/sitesYê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.
Quyết định
SITE_IDcho trang web Hosting mặc định của bạn. Hãy lưu ý những điều sau khi quyết địnhSITE_IDnày:SITE_IDnày được dùng để tạo các miền phụ Firebase mặc định:
vàSITE_ID.web.app .SITE_ID.firebaseapp.comSITE_IDcó 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
- Phải là nhãn tên máy chủ hợp lệ, nghĩa là không được chứa
Xin lưu ý rằng bạn nên sử dụng mã dự án làm
SITE_IDcho 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.Tạo trang web Hosting mặc định bằng cách gọi điểm cuối
sites.createbằngSITE_IDmà 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_IDYê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.createsẽ 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.
Xác định SITE_ID cho trang web mà bạn muốn triển khai.
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/versionsYê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, file2 và file3.
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.gzvàfile3.gz.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.
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:populateFilesYê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áchuploadRequiredHashes.uploadUrldà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.
Nối dấu gạch chéo và hà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.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.gzvàfile3.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_HASHYê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/file1https://SITE_ID.web.app/file2https://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.