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:
Mở trang API Firebase Hosting trong Google API Console.
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ã 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ụ:
Trong bảng điều khiển Firebase, hãy mở Settings (Cài đặt) > Service Accounts (Tài khoản dịch vụ).
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á.
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.
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.
Quyết định
SITE_ID
cho trang web Hosting mặc định. Hãy lưu ý những điều sau khi quyết địnhSITE_ID
này:SITE_ID
này được dùng để tạo các miền con Firebase mặc định:
và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à 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
- 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_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.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ụngSITE_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.
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 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
, file2
và file3
.
Nén tệp:
gzip file1 && gzip file2 && gzip file3
Bây giờ, bạn có 3 tệp nén
file1.gz
,file2.gz
và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ó ba hàm băm SHA256 của ba tệp nén.
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
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
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áchuploadRequiredHashes
.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.
Thêm dấu gạch chéo lên và hà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
.Tải từng tệp bắt buộc lên (trong ví dụ này, chỉ có
file2.gz
và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
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.