Implemente en su sitio utilizando la API REST de hosting

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:

  1. Abra la página de la API de Firebase Hosting en la consola de API de Google.

  2. Cuando se le solicite, seleccione su proyecto de Firebase.

  3. 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:

  1. En Firebase console, abre Configuración > Cuentas de servicio .

  2. Haga clic en Generar nueva clave privada y luego confirme haciendo clic en Generar clave .

  3. 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:

nodo.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);
    });
  });
}

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 .

Pitón

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();
}

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.

  1. Compruebe si su proyecto ya tiene un sitio de alojamiento predeterminado llamando al punto final sites.list .

    Por ejemplo:

    comando de curvatura

    curl -H "Content-Type: application/json" \
           -H "Authorization: Bearer ACCESS_TOKEN" \
    
    https://firebasehosting.googleapis.com/v1beta1/projects/PROJECT_ID/sites
    

    Solicitud HTTPS sin formato

    Host: firebasehosting.googleapis.com
    
    POST /v1beta1/projects/PROJECT_ID/sites HTTP/1.1
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/json
    
    • Si 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.

  2. Decida el SITE_ID para su sitio de alojamiento predeterminado. Tenga en cuenta lo siguiente al decidir este SITE_ID :

    • Este SITE_ID se utiliza para crear sus subdominios predeterminados de Firebase:
      SITE_ID .web.app y SITE_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 .

  3. Cree su sitio de alojamiento predeterminado llamando al punto final sites.create utilizando el SITE_ID deseado como parámetro siteId .

    Por ejemplo:

    comando de curvatura

    curl -H "Content-Type: application/json" \
           -H "Authorization: Bearer ACCESS_TOKEN" \
    
    https://firebasehosting.googleapis.com/v1beta1/projects/PROJECT_ID/sites?siteId=SITE_ID
    

    Solicitud HTTPS sin formato

    Host: firebasehosting.googleapis.com
    
    POST /v1beta1/projects/PROJECT_ID/sites?siteId=SITE_ID
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/json
    

    Esta 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

Su primera llamada a la API es para crear una nueva Version para su sitio. Más adelante en esta guía, cargará archivos en esta versión y luego los implementará en su sitio.

  1. Determine el SITE_ID del sitio en el que desea implementar.

  2. 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:

    comando de curvatura

    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
    

    Solicitud HTTPS sin formato

    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"
          }
        }]
      }
    }
    

Esta llamada API a versions.create devuelve el siguiente JSON:

{
  "name": "sites/SITE_ID/versions/VERSION_ID",
  "status": "CREATED",
  "config": {
    "headers": [{
      "glob": "**",
      "headers": {
        "Cache-Control": "max-age=1800"
      }
    }]
  }
}

Esta respuesta contiene un identificador único para la nueva versión, en el formato: 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

Ahora que tiene su identificador de nueva versión, debe indicarle a Firebase Hosting qué archivos desea implementar eventualmente en esta nueva versión.

Tenga en cuenta que Hosting tiene un límite de tamaño máximo de 2 GB para archivos individuales.

Esta API requiere que identifique archivos mediante un hash SHA256. Entonces, antes de poder realizar la llamada API, primero deberá calcular un hash para cada archivo estático comprimiendo los archivos y luego tomando el hash SHA256 de cada archivo recién comprimido.

Continuando con nuestro ejemplo, digamos que desea implementar tres archivos en la nueva versión: file1 , file2 y file3 .

  1. Comprime los archivos:

    gzip file1 && gzip file2 && gzip file3

    Ahora tiene tres archivos comprimidos file1.gz , file2.gz y file3.gz .

  2. 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.

  3. 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:

    comando de curvatura

    $ 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
    

    Solicitud HTTPS sin procesar

    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"
      }
    }
    

Esta llamada API a versions.populateFiles devuelve el siguiente JSON:

{
  "uploadRequiredHashes": [
    "490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083",
    "59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315"
  ],
  "uploadUrl": "https://upload-firebasehosting.googleapis.com/upload/sites/SITE_ID/versions/VERSION_ID/files"
}

Esta respuesta incluye:

  • 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 lista uploadRequiredHashes .

  • La uploadUrl que es específica de la nueva versión.

En el siguiente paso para cargar los dos archivos nuevos, necesitará los hashes y la uploadURL de la respuesta de versions.populateFiles .

Paso 5: cargue los archivos requeridos

Debe cargar individualmente cada archivo requerido (aquellos archivos que se enumeran en 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.

  1. 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 .

  2. Cargue todos los archivos necesarios uno por uno (en este ejemplo, solo file2.gz y file3.gz ) a la URL específica del archivo mediante una serie de solicitudes.

    Por ejemplo, para cargar el file2.gz comprimido 2.gz:

    comando de curvatura

    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
    

    Solicitud HTTPS sin procesar

    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
    

Las cargas exitosas devuelven una respuesta HTTPS 200 OK .

Paso 6: actualice el estado de la versión a FINALIZADO

Una vez que haya cargado todos los archivos que aparecen en la respuesta de versions.populateFiles , puede actualizar el estado de su versión a FINALIZED .

Llame al punto final versions.patch con el campo status en su solicitud de API configurado en FINALIZED .

Por ejemplo:

comando de curvatura

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

Solicitud HTTPS sin formato

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"}

Esta llamada API a 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

Ahora que tiene una versión finalizada, libérela para su implementación. Para este paso, necesita crear una Release de su versión que contenga la configuración de alojamiento y todos los archivos de contenido para su nueva versión.

Llame al punto final releases.create para crear su versión.

Por ejemplo:

comando de curvatura

curl -H "Authorization: Bearer ACCESS_TOKEN" \
       -X POST
https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/releases?versionName=sites/SITE_ID/versions/VERSION_ID

Solicitud HTTPS sin procesar

Host: firebasehosting.googleapis.com

POST /v1beta1/sites/SITE_ID/releases?versionName=sites/SITE_ID/versions/VERSION_ID HTTP/1.1
Authorization: Bearer ACCESS_TOKEN

Esta llamada API a 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"
}

La configuración de alojamiento y todos los archivos para la nueva versión ahora deberían estar implementados en su sitio y podrá acceder a sus archivos mediante las URL:

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

También se puede acceder a estos archivos en las URL asociadas con su dominio SITE_ID .firebaseapp.com .

También puede ver su nueva versión en el panel de Hosting de Firebase console.