Firebase Hosting REST API 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 do Firebase lưu trữ. Sử dụng REST API 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 CLI Firebase cho các hoạt động triển khai, bạn có thể sử dụng REST API Firebase Hosting để tạo một version
mới gồm các thành phần cho trang web của mình theo cách lập trình, tải tệp lên phiên bản rồi triển khai phiên bản đó cho trang web của bạn.
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 REST API kết hợp với một cron job, 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 một 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ụ dành cho nhà phát triển. Bạn có thể tạo một lựa 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 một 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, chẳng hạn như một wiki hoặc một 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 chi phí điện toán và phân phát tệp theo cách có khả năng mở rộng 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ẽ trình bày 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 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 Hosting.
Trước khi bắt đầu: Bật API REST
Bạn phải bật Firebase Hosting REST API trong Google API Console:
Mở trang Firebase Hosting API trong Bảng điều khiển Google API.
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à 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ể 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 đăng nhập nhận được thông qua tài khoản dịch vụ này để uỷ quyền cho các yêu cầu của 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 > Service Accounts (Cài đặt > 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 đă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:
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 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 phần Mã thông báo web JSON.
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
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 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 mới.
Bước 2: Đảm bảo dự án của bạn có một trang web Hosting mặc định
Trước khi triển khai lần đầu tiên đến Firebase Hosting, dự án Firebase của bạn phải có một 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ụ:
curl -H "Content-Type: application/json" \ -H "Authorization: Bearer
ACCESS_TOKEN " \ https://firebasehosting.googleapis.com/v1beta1/projects/PROJECT_ID /sitesHost: firebasehosting.googleapis.com POST /v1beta1/projects/
PROJECT_ID /sites HTTP/1.1 Authorization: BearerACCESS_TOKEN Content-Type: application/jsonNế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 nhận được một mảng trống, 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 của bạn. Khi quyết định chọnSITE_ID
này, hãy lưu ý những điều sau:SITE_ID
này được dùng để tạo các miền phụ mặc định của Firebase:
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ệ, tức 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ệ, tức 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 của mì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ằngSITE_ID
mà bạn muốn làm tham sốsiteId
.Ví dụ:
curl -H "Content-Type: application/json" \ -H "Authorization: Bearer
ACCESS_TOKEN " \ https://firebasehosting.googleapis.com/v1beta1/projects/PROJECT_ID /sites?siteId=SITE_ID Host: firebasehosting.googleapis.com POST /v1beta1/projects/
PROJECT_ID /sites?siteId=SITE_ID Authorization: BearerACCESS_TOKEN Content-Type: application/jsonLệ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 một 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ột Version
mới cho trang web của bạn.
Sau này trong 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 tệp đó 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 mộ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ụ thể.
Ví dụ:
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 /versionsHost: firebasehosting.googleapis.com POST /v1beta1/sites/
SITE_ID /versions HTTP/1.1 Authorization: BearerACCESS_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, theo đị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 các 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 cho từng tệp.
API này yêu cầu bạn xác định các 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ới 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
.
Nén tệp bằng gzip:
gzip file1 && gzip file2 && gzip file3
Giờ đây, bạn có 3 tệp nén là
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ó 3 hàm băm SHA256 của 3 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,/file1
,/file2
và/file3
).Ví dụ:
$ 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 :populateFilesHost: firebasehosting.googleapis.com POST /v1beta1/sites/
SITE_ID /versions/VERSION_ID :populateFiles HTTP/1.1 Authorization: BearerACCESS_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" }
Câu trả lời này bao gồm:
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 một phiên bản trước, nên 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 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 những tệp tải lên này, bạn sẽ cần hàm băm tệp và uploadUrl
ở bước trước.
Thêm một dấu gạch chéo và 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 lần lượt tất cả các tệp bắt buộc (trong ví dụ này, chỉ có
file2.gz
vàfile3.gz
) lên 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: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 Host: upload-firebasehosting.googleapis.com POST /upload/sites/
SITE_ID /versions/VERSION_ID /files/FILE_HASH HTTP/1.1 Authorization: BearerACCESS_TOKEN Content-Type: application/octet-stream Content-Length: 500content-of-file2.gz
Tệp 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 tất cả các tệp có 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ụ:
curl -H "Content-Type: application/json" \ -H "Authorization: BearerACCESS_TOKEN " \ -X PATCH \ -d '{"status": "FINALIZED"}' \ https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID /versions/VERSION_ID ?update_mask=status
Host: firebasehosting.googleapis.com PATCH /v1beta1/sites/SITE_ID /versions/VERSION_ID ?update_mask=status HTTP/1.1 Authorization: BearerACCESS_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ờ, khi đã có phiên bản hoàn chỉnh, 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 một Release
của 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.
Gọi điểm cuối releases.create
để tạo bản phát hành.
Ví dụ:
curl -H "Authorization: BearerACCESS_TOKEN " \ -X POST https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID /releases?versionName=sites/SITE_ID /versions/VERSION_ID
Host: firebasehosting.googleapis.com POST /v1beta1/sites/SITE_ID /releases?versionName=sites/SITE_ID /versions/VERSION_ID HTTP/1.1 Authorization: BearerACCESS_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" }
Giờ đây, 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 cho trang web của bạn và bạn có thể truy cập vào các tệp bằng cách sử dụ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 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 trong trang tổng quan Hosting của bảng điều khiển Firebase.