Mit der Hosting REST API auf Ihrer Website bereitstellen

Mit der Firebase Hosting REST API können Sie programmatische und anpassbare Bereitstellungen auf Ihren von Firebase gehosteten Websites vornehmen. Mit dieser REST API können Sie neue oder aktualisierte Hosting-Inhalte und ‑Konfigurationen bereitstellen.

Alternativ zur Verwendung der Firebase CLI für Bereitstellungen können Sie mit der Firebase Hosting REST API programmatisch eine neue version mit Assets für Ihre Website erstellen, Dateien in die Version hochladen und die Version dann auf Ihrer Website bereitstellen.

Mit der Firebase Hosting REST API haben Sie beispielsweise folgende Möglichkeiten:

  • Bereitstellungen planen Wenn Sie die REST API in Verbindung mit einem Cron-Job verwenden, können Sie Firebase-gehostete Inhalte regelmäßig ändern, z. B. um eine spezielle Version Ihrer Inhalte für Feiertage oder Veranstaltungen bereitzustellen.

  • In Entwicklertools einbinden Sie können in Ihrem Tool eine Option erstellen, mit der Sie Ihre Webanwendungsprojekte mit nur einem Klick auf Firebase Hosting bereitstellen können (z. B. durch Klicken auf eine Bereitstellungsschaltfläche in einer IDE).

  • Bereitstellungen automatisieren, wenn statische Inhalte generiert werden. Wenn ein Prozess statische Inhalte programmatisch generiert (z. B. von Nutzern erstellte Inhalte wie ein Wiki oder ein Nachrichtenartikel), können Sie die generierten Inhalte als statische Dateien bereitstellen, anstatt sie dynamisch bereitzustellen. So sparen Sie teure Rechenleistung und können Ihre Dateien auf skalierbarere Weise bereitstellen.

In diesem Leitfaden wird zuerst beschrieben, wie Sie die API aktivieren, authentifizieren und autorisieren. Anschließend wird in diesem Leitfaden anhand eines Beispiels gezeigt, wie Sie eine Firebase Hosting-Version erstellen, die erforderlichen Dateien in die Version hochladen und die Version schließlich bereitstellen.

Weitere Informationen zu dieser REST API finden Sie auch in der vollständigen Hosting REST API-Referenzdokumentation.

Bevor Sie beginnen: REST API aktivieren

Sie müssen die Firebase Hosting REST API in der Google APIs Console aktivieren:

  1. Öffnen Sie in der Google APIs Console die Seite Firebase Hosting API.

  2. Wählen Sie Ihr Firebase-Projekt aus, wenn Sie dazu aufgefordert werden.

  3. Klicken Sie auf der Seite der Firebase Hosting API auf Aktivieren.

Schritt 1: Zugriffstoken abrufen, um API-Anfragen zu authentifizieren und zu autorisieren

Firebase-Projekte unterstützen Google-Dienstkonten, mit denen Sie Firebase Server APIs von Ihrem Anwendungsserver oder einer vertrauenswürdigen Umgebung aus aufrufen können. Wenn Sie Code lokal entwickeln oder Ihre Anwendung vor Ort bereitstellen, können Sie über dieses Dienstkonto abgerufene Anmeldedaten verwenden, um Serveranfragen zu autorisieren.

Wenn Sie ein Dienstkonto authentifizieren und autorisieren möchten, auf Firebase-Dienste zuzugreifen, müssen Sie eine private Schlüsseldatei im JSON-Format generieren.

So generieren Sie eine private Schlüsseldatei für Ihr Dienstkonto:

  1. Öffnen Sie in der Firebase-Konsole Einstellungen > Dienstkonten.

  2. Klicke auf Neuen privaten Schlüssel generieren und bestätige die Aktion mit einem Klick auf Schlüssel generieren.

  3. Speichern Sie die JSON-Datei mit dem Schlüssel sicher.

Verwenden Sie Ihre Firebase-Anmeldedaten zusammen mit der Google Auth-Bibliothek für Ihre bevorzugte Sprache, um ein kurzlebiges OAuth 2.0-Zugriffstoken abzurufen:

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

In diesem Beispiel authentifiziert die Google API-Clientbibliothek die Anfrage mit einem JSON-Webtoken (JWT). Weitere Informationen finden Sie unter JSON Web Tokens.

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

Nach Ablauf des Zugriffstokens wird die Tokenaktualisierungsmethode automatisch aufgerufen, um ein aktualisiertes Zugriffstoken abzurufen.

Schritt 2: Prüfen, ob Ihr Projekt eine Standard-Hosting-Website hat

Vor der ersten Bereitstellung in Firebase Hosting muss Ihr Firebase-Projekt einen Standardwert für Hosting SITE haben.

  1. Rufen Sie den Endpunkt sites.list auf, um zu prüfen, ob Ihr Projekt bereits eine Standard-Hosting-Website hat.

    Beispiel:

    cURL-Befehl

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

    HTTPS-Rohanfrage

    Host: firebasehosting.googleapis.com
    
    POST /v1beta1/projects/PROJECT_ID/sites HTTP/1.1
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/json
    • Wenn für eine der Websites "type": "DEFAULT_SITE" festgelegt ist, hat Ihr Projekt bereits eine Hosting-Standardwebsite. Überspringen Sie den Rest dieses Schritts und fahren Sie mit dem nächsten fort: Neue Version Ihrer Website erstellen.

    • Wenn Sie ein leeres Array erhalten, haben Sie keine Standard-Hosting-Website. Führen Sie den Rest dieses Schritts aus.

  2. Legen Sie die SITE_ID für Ihre Standard-Hosting-Website fest. Beachten Sie bei der Entscheidung für eine SITE_ID Folgendes:

    • Mit diesem SITE_ID werden Ihre Standard-Firebase-Subdomains erstellt:
      SITE_ID.web.app und SITE_ID.firebaseapp.com.

    • Für SITE_ID gelten die folgenden Anforderungen:

      • Muss ein gültiges Hostnamenlabel sein, d. h., es darf keine Zeichen wie . oder _ enthalten.
      • Darf höchstens 30 Zeichen lang sein
      • Muss global eindeutig sein

    Wir empfehlen oft, die Projekt-ID als SITE_ID für die Standard-Hosting-Website zu verwenden. Unter Informationen zu Firebase-Projekten erfahren Sie, wie Sie diese ID finden.

  3. Erstellen Sie Ihre Standard-Hosting-Website, indem Sie den Endpunkt sites.create mit der gewünschten SITE_ID als siteId-Parameter aufrufen.

    Beispiel:

    cURL-Befehl

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

    Rohe HTTPS-Anfrage

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

    Dieser API-Aufruf an sites.create gibt die folgende JSON zurück:

    {
      "name": "projects/PROJECT_ID/sites/SITE_ID",
      "defaultUrl": "https://SITE_ID.web.app",
      "type": "DEFAULT_SITE"
    }

Schritt 3: Neue Version Ihrer Website erstellen

Mit dem ersten API-Aufruf erstellen Sie eine neue Version für Ihre Website. Später in dieser Anleitung laden Sie Dateien in diese Version hoch und stellen sie dann auf Ihrer Website bereit.

  1. Ermitteln Sie die SITE_ID für die Website, auf der Sie die Bereitstellung vornehmen möchten.

  2. Rufen Sie den Endpunkt versions.create mithilfe der SITE_ID im Aufruf auf.

    (Optional) Sie können im Aufruf auch ein Firebase Hosting-Konfigurationsobjekt übergeben und einen Header festlegen, mit dem alle Dateien für einen bestimmten Zeitraum im Cache gespeichert werden.

    Beispiel:

    cURL-Befehl

    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
    

    Rohe HTTPS-Anfrage

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

Dieser API-Aufruf an versions.create gibt die folgende JSON zurück:

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

Diese Antwort enthält eine eindeutige Kennung für die neue Version im Format: sites/SITE_ID/versions/VERSION_ID. Sie benötigen diese eindeutige Kennung in diesem Leitfaden, um auf diese Version zu verweisen.

Schritt 4: Liste der Dateien angeben, die Sie bereitstellen möchten

Nachdem Sie nun die neue Versions-ID haben, müssen Sie Firebase Hosting mitteilen, welche Dateien in dieser neuen Version bereitgestellt werden sollen.

Für einzelne Dateien gilt bei Hosting ein maximales Limit von 2 GB.

Bei dieser API müssen Sie Dateien mit einem SHA256-Hash identifizieren. Bevor Sie den API-Aufruf ausführen können, müssen Sie zuerst einen Hashwert für jede statische Datei berechnen. Dazu komprimieren Sie die Dateien mit Gzip und ermitteln dann den SHA256-Hashwert der neu komprimierten Datei.

Angenommen, Sie möchten in der neuen Version drei Dateien bereitstellen: file1, file2 und file3.

  1. Gzip die Dateien:

    gzip file1 && gzip file2 && gzip file3

    Sie haben jetzt die drei komprimierten Dateien file1.gz, file2.gz und file3.gz.

  2. Rufen Sie den SHA256-Hash jeder komprimierten Datei ab:

    cat file1.gz | openssl dgst -sha256
    
    66d61f86bb684d0e35f94461c1f9cf4f07a4bb3407bfbd80e518bd44368ff8f4
    
    cat file2.gz | openssl dgst -sha256
    
    490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083
    
    cat file3.gz | openssl dgst -sha256
    
    59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315
    

    Jetzt haben Sie die drei SHA256-Hashes der drei komprimierten Dateien.

  3. Sende diese drei Hashes in einer API-Anfrage an den Endpunkt versions.populateFiles. Geben Sie jeden Hashwert mit dem gewünschten Pfad für die hochgeladene Datei an (in diesem Beispiel /file1, /file2 und /file3).

    Beispiel:

    cURL-Befehl

    $ 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
    

    HTTPS-Rohanfrage

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

Dieser API-Aufruf an versions.populateFiles gibt die folgende JSON zurück:

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

Diese Antwort enthält:

  • Der Hashwert jeder Datei, die hochgeladen werden muss. In diesem Beispiel wurde file1 beispielsweise bereits in einer früheren Version hochgeladen. Sein Hashwert ist daher nicht in der Liste uploadRequiredHashes enthalten.

  • Die uploadUrl, die für die neue Version spezifisch ist.

Im nächsten Schritt benötigen Sie zum Hochladen der beiden neuen Dateien die Hashes und die uploadURL aus der versions.populateFiles-Antwort.

Schritt 5: Erforderliche Dateien hochladen

Sie müssen jede erforderliche Datei einzeln hochladen (die Dateien, die in uploadRequiredHashes aus der versions.populateFiles-Antwort im vorherigen Schritt aufgeführt sind). Für diese Dateiuploads benötigen Sie die Datei-Hashes und die uploadUrl aus dem vorherigen Schritt.

  1. Fügen Sie der uploadUrl einen Schrägstrich und den Hash der Datei an, um eine dateispezifische URL im Format https://upload-firebasehosting.googleapis.com/upload/sites/SITE_ID/versions/VERSION_ID/files/FILE_HASH zu erstellen.

  2. Laden Sie alle erforderlichen Dateien einzeln (in diesem Beispiel nur file2.gz und file3.gz) über mehrere Anfragen auf die dateispezifische URL hoch.

    So laden Sie beispielsweise die komprimierte file2.gz hoch:

    cURL-Befehl

    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
    

    Rohe HTTPS-Anfrage

    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

Bei erfolgreichen Uploads wird eine 200 OK-HTTPS-Antwort zurückgegeben.

Schritt 6: Status der Version in „FINALISIERT“ ändern

Nachdem Sie alle Dateien hochgeladen haben, die in der versions.populateFiles-Antwort aufgeführt sind, können Sie den Status Ihrer Version auf FINALIZED aktualisieren.

Rufen Sie den Endpunkt versions.patch auf und legen Sie in Ihrer API-Anfrage das Feld status auf FINALIZED fest.

Beispiel:

cURL-Befehl

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

Rohe HTTPS-Anfrage

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

Dieser API-Aufruf an versions.patch gibt die folgende JSON zurück. Prüfen Sie, ob status auf FINALIZED aktualisiert wurde.

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

Schritt 7: Version für die Bereitstellung freigeben

Nachdem Sie nun eine fertige Version erstellt haben, können Sie sie für die Bereitstellung freigeben. Für diesen Schritt müssen Sie eine Release Ihrer Version erstellen, die die Hostingkonfiguration und alle Inhaltsdateien für die neue Version enthält.

Rufen Sie den Endpunkt releases.create auf, um einen Release zu erstellen.

Beispiel:

cURL-Befehl

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

Rohe HTTPS-Anfrage

Host: firebasehosting.googleapis.com

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

Dieser API-Aufruf an releases.create gibt die folgende JSON zurück:

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

Die Hostingkonfiguration und alle Dateien für die neue Version sollten jetzt auf Ihrer Website bereitgestellt sein. Sie können über die folgenden URLs auf Ihre Dateien zugreifen:

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

Auf diese Dateien kann auch über URLs zugegriffen werden, die mit Ihrer SITE_ID.firebaseapp.com-Domain verknüpft sind.

Sie finden Ihre neue Version auch im Hosting-Dashboard der Firebase-Konsole.