La API REST de Firebase Hosting permite implementaciones programáticas y personalizables en sus sitios alojados en Firebase. Utilice esta API REST para implementar contenido y configuración de Hosting nuevos o actualizados.
Como alternativa al uso de Firebase CLI para implementaciones, puede usar la API REST de Firebase Hosting para crear mediante programación una nueva version
de los recursos para su sitio, cargar archivos a la versión y luego implementar la versión en su sitio.
Por ejemplo, con la API REST de Firebase Hosting, puedes:
Programar implementaciones. Al utilizar la API REST junto con una tarea cron, puedes cambiar el contenido alojado en Firebase de forma regular (por ejemplo, para implementar una versión especial de tu contenido relacionada con un evento o un día festivo).
Integre con herramientas de desarrollador. Puede crear una opción en su herramienta para implementar sus proyectos de aplicaciones web en Firebase Hosting con solo un clic (por ejemplo, hacer clic en un botón de implementación dentro de un IDE).
Automatiza las implementaciones cuando se genera contenido estático. Cuando un proceso genera contenido estático mediante programación (por ejemplo, contenido generado por el usuario, como un wiki o un artículo de noticias), puede implementar el contenido generado como archivos estáticos en lugar de servirlos dinámicamente. Esto le ahorra costosa potencia informática y sirve sus archivos de una manera más escalable.
Esta guía describe primero cómo habilitar, autenticar y autorizar la API. Luego, esta guía muestra un ejemplo para crear una versión de Firebase Hosting, cargar los archivos necesarios a la versión y, finalmente, implementar la versión.
También puede obtener más información sobre esta API REST en la documentación de referencia completa de la API REST de Hosting .
Antes de comenzar: habilite la API REST
Debes habilitar la API REST de Firebase Hosting en la consola de API de Google:
Abra la página de la API de Firebase Hosting en la consola de API de Google.
Cuando se le solicite, seleccione su proyecto de Firebase.
Haga clic en Habilitar en la página API de Firebase Hosting.
Paso 1: obtenga un token de acceso para autenticar y autorizar solicitudes de API
Los proyectos de Firebase admiten cuentas de servicio de Google, que puedes usar para llamar a las API del servidor de Firebase desde tu servidor de aplicaciones o entorno confiable. Si está desarrollando código localmente o implementando su aplicación localmente, puede usar las credenciales obtenidas a través de esta cuenta de servicio para autorizar las solicitudes del servidor.
Para autenticar una cuenta de servicio y autorizarla a acceder a los servicios de Firebase, debe generar un archivo de clave privada en formato JSON.
Para generar un archivo de clave privada para su cuenta de servicio:
En Firebase console, abre Configuración > Cuentas de servicio .
Haga clic en Generar nueva clave privada y luego confirme haciendo clic en Generar clave .
Almacene de forma segura el archivo JSON que contiene la clave.
Utilice sus credenciales de Firebase junto con la biblioteca de autenticación de Google para su idioma preferido para recuperar un token de acceso OAuth 2.0 de corta duració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);
});
});
}
En este ejemplo, la biblioteca cliente API de Google autentica la solicitud con un token web JSON o JWT. Para obtener más información, consulte Tokens 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();
}
Una vez que caduque su token de acceso, se llama automáticamente al método de actualización del token para recuperar un token de acceso actualizado.
Paso 2: asegúrese de que su proyecto tenga un sitio de alojamiento predeterminado
Antes de su primera implementación en Firebase Hosting, su proyecto de Firebase debe tener un SITE
de Hosting predeterminado.
Compruebe si su proyecto ya tiene un sitio de alojamiento predeterminado llamando al punto final
sites.list
.Por ejemplo:
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/jsonSi uno de los sitios tiene
"type": "DEFAULT_SITE"
, entonces su proyecto ya tiene un sitio de alojamiento predeterminado. Omita el resto de este paso y continúe con el siguiente: Cree una nueva versión para su sitio .Si obtiene una matriz vacía, entonces no tiene un sitio de alojamiento predeterminado. Complete el resto de este paso.
Decida el
SITE_ID
para su sitio de alojamiento predeterminado. Tenga en cuenta lo siguiente al decidir esteSITE_ID
:Este
SITE_ID
se utiliza para crear sus subdominios predeterminados de Firebase:SITE_ID .web.app
ySITE_ID .firebaseapp.com
.Un SITE_ID
tiene los siguientes requisitos:Debe ser una etiqueta de nombre de host válida, lo que significa que no puede contener archivos .
,_
, etc.Debe tener 30 caracteres o menos. Debe ser globalmente único dentro de Firebase.
Tenga en cuenta que a menudo recomendamos utilizar el ID de su proyecto como SITE_ID
para su sitio de alojamiento predeterminado. Aprenda cómo encontrar este ID en Comprender los proyectos de Firebase .Cree su sitio de alojamiento predeterminado llamando al punto final sites.create
utilizando elSITE_ID
deseado como parámetrositeId
.Por ejemplo: 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/jsonEsta llamada API a sites.create
devuelve el siguiente JSON:{
"name": "projects/PROJECT_ID /sites/SITE_ID ",
"defaultUrl": "https://SITE_ID .web.app",
"type": "DEFAULT_SITE"
}
Paso 3: cree una nueva versión para su sitio
Version
para su sitio. Más adelante en esta guía, cargará archivos en esta versión y luego los implementará en su sitio.
Determine el SITE_ID del sitio en el que desea implementar. Llame al punto final versiones.create usando su SITE_ID en la llamada. (Opcional) También puedes pasar un objeto de configuración de Firebase Hosting en la llamada, incluida la configuración de un encabezado que almacene en caché todos los archivos durante un período de tiempo específico. Por ejemplo: 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"
}
}]
}
}
versions.create
devuelve el siguiente JSON:
{
"name": "sites/SITE_ID /versions/VERSION_ID ",
"status": "CREATED",
"config": {
"headers": [{
"glob": "**",
"headers": {
"Cache-Control": "max-age=1800"
}
}]
}
}
sites/ SITE_ID /versions/ VERSION_ID
. Necesitará este identificador único a lo largo de esta guía para hacer referencia a esta versión específica.
Paso 4: especifique la lista de archivos que desea implementar
file1
, file2
y file3
.
Comprime los archivos: gzip file1 && gzip file2 && gzip file3 Ahora tiene tres archivos comprimidos file1.gz
,file2.gz
yfile3.gz
.Obtenga el hash SHA256 de cada archivo comprimido: cat file1.gz | openssl dgst -sha256 66d61f86bb684d0e35f94461c1f9cf4f07a4bb3407bfbd80e518bd44368ff8f4 cat file2.gz | openssl dgst -sha256 490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083 cat file3.gz | openssl dgst -sha256 59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315 Ahora tienes los tres hashes SHA256 de los tres archivos comprimidos. Envíe estos tres hashes en una solicitud de API al punto final de versions.populateFiles
. Enumere cada hash según la ruta deseada para el archivo cargado (en este ejemplo,/file1
,/file2
y/file3
).Por ejemplo: $ 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"
}
}
versions.populateFiles
devuelve el siguiente JSON:
{
"uploadRequiredHashes": [
"490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083",
"59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315"
],
"uploadUrl": "https://upload-firebasehosting.googleapis.com/upload/sites/SITE_ID /versions/VERSION_ID /files"
}
El hash de cada archivo que debe cargarse. Por ejemplo, en este ejemplo file1
ya se había subido en una versión anterior, por lo que su hash no está incluido en la listauploadRequiredHashes
.La uploadUrl
que es específica de la nueva versión.
uploadURL
de la respuesta de versions.populateFiles
.
Paso 5: cargue los archivos requeridos
uploadRequiredHashes
de la respuesta de versions.populateFiles
en el paso anterior). Para estas cargas de archivos, necesitará los hash del archivo y la uploadUrl
del paso anterior.
Agregue una barra diagonal y el hash del archivo a uploadUrl
para crear una URL específica del archivo en el formato:https://upload-firebasehosting.googleapis.com/upload/sites/ SITE_ID /versions/ VERSION_ID /files/ FILE_HASH
.Cargue todos los archivos necesarios uno por uno (en este ejemplo, solo file2.gz
yfile3.gz
) a la URL específica del archivo mediante una serie de solicitudes.Por ejemplo, para cargar el file2.gz
comprimido 2.gz: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
200 OK
.
Paso 6: actualice el estado de la versión a FINALIZADO
versions.populateFiles
, puede actualizar el estado de su versión a FINALIZED
.
versions.patch
con el campo status
en su solicitud de API configurado en FINALIZED
.
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
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"}
versions.patch
devuelve el siguiente JSON. Compruebe que status
se haya actualizado a 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"
}
Paso 7: publicar la versión para su implementación
Release
de su versión que contenga la configuración de alojamiento y todos los archivos de contenido para su nueva versión.
releases.create
para crear su versión.
curl -H "Authorization: Bearer ACCESS_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
releases.create
devuelve el siguiente JSON:
{
"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"
}
https:// SITE_ID .web.app/file1
https:// SITE_ID .web.app/file2
https:// SITE_ID .web.app/file3
SITE_ID .firebaseapp.com
.