Wdróż w swojej witrynie przy użyciu interfejsu Hosting REST API

Interfejs Firebase HostingREST API umożliwia wdrażanie witryn hostowanych w Firebase w sposób zautomatyzowany i z możliwością dostosowania. Użyj tego interfejsu API REST do wdrożenia nowych lub zaktualizowanych treści i konfiguracji Hosting.

Zamiast używać interfejsu wiersza poleceń Firebase do wdrażania, możesz użyć interfejsu API REST Firebase Hosting, aby programowo utworzyć nową version zasobów dla witryny, przesłać pliki do wersji, a następnie wdrożyć tę wersję w witrynie.

Za pomocą interfejsu API REST Firebase Hosting możesz na przykład:

  • Planowanie wdrożeń. Za pomocą interfejsu API REST w połączeniu z zadaniem cron możesz zmieniać treści hostowane w Firebase zgodnie z określonym harmonogramem (np. aby wdrożyć specjalną wersję treści związaną z okresem świątecznym lub wydarzeniem).

  • Integracja z narzędziami dla programistów W narzędziu możesz utworzyć opcję wdrażania projektów aplikacji internetowych do Firebase Hosting za pomocą jednego kliknięcia (np. kliknięcia przycisku wdrażania w IDE).

  • Automatycznie wdraża treści statyczne. Gdy proces generuje treści statyczne za pomocą programu (np. treści użytkowników, takie jak wiki czy artykuły informacyjne), możesz wdrożyć wygenerowane treści jako pliki statyczne zamiast wyświetlać je dynamicznie. Dzięki temu oszczędzasz moc obliczeniową i serwujesz pliki w bardziej skalowalny sposób.

W tym przewodniku opisaliśmy, jak włączyć interfejs API, uwierzytelnić go i autoryzować. Następnie ten przewodnik pokazuje przykład tworzenia wersji Firebase Hosting, przesyłania do niej wymaganych plików, a na koniec wdrażania tej wersji.

Więcej informacji o tym interfejsie API REST znajdziesz w pełnej Hostingdokumentacji API REST.

Zanim zaczniesz: włącz interfejs API REST

Musisz włączyć interfejs API REST Firebase Hosting w konsoli interfejsów API Google:

  1. Otwórz stronę Firebase Hostinginterfejsu API w konsoli interfejsów API Google.

  2. Gdy pojawi się taka prośba, wybierz projekt Firebase.

  3. Na stronie interfejsu API Firebase Hosting kliknij Włącz.

Krok 1. Uzyskaj token dostępu, aby uwierzytelniać i autoryzować żądania do interfejsu API

Projekty Firebase obsługują konta usługi Google, których możesz używać do wywoływania interfejsów API serwera Firebase z serwera aplikacji lub z zaufanego środowiska. Jeśli kod tworzysz lokalnie lub wdrażasz aplikację lokalnie, możesz użyć danych logowania uzyskanych za pomocą tego konta usługi, aby autoryzować żądania serwera.

Aby uwierzytelnić konto usługi i zezwolić mu na dostęp do usług Firebase, musisz wygenerować plik klucza prywatnego w formacie JSON.

Aby wygenerować plik klucza prywatnego dla konta usługi:

  1. W konsoli Firebase otwórz Ustawienia > Konta usługi.

  2. Kliknij Wygeneruj nowy klucz prywatny, a następnie potwierdź, klikając Wygeneruj klucz.

  3. Bezpiecznie przechowuj plik JSON zawierający klucz.

Aby pobrać krótkotrwały token dostępu OAuth 2.0, użyj danych logowania Firebase wraz z biblioteką Google Auth Library w preferowanym języku:

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

W tym przykładzie biblioteka klienta interfejsu Google API uwierzytelnia żądanie za pomocą tokena sieciowego JSON (JWT). Więcej informacji znajdziesz w artykule Tokeny sieciowe 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();
}

Gdy token dostępu wygaśnie, metoda odświeżania tokena zostanie wywołana automatycznie, aby pobrać zaktualizowany token dostępu.

Krok 2. Sprawdź, czy projekt ma domyślną witrynę Hosting

Przed pierwszym wdrożeniem na Firebase Hosting projekt Firebase musi mieć domyślny Hosting SITE.

    Firebase Hosting
  1. Aby sprawdzić, czy projekt ma już domyślną witrynę Hosting, wywołaj punkt końcowy sites.list.

    Przykład:

    Polecenie cURL

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

    Żądanie HTTPS w postaci zwykłego tekstu

    Host: firebasehosting.googleapis.com
    
    POST /v1beta1/projects/PROJECT_ID/sites HTTP/1.1
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/json
    • Jeśli jedna z witryn ma adres "type": "DEFAULT_SITE", Twój projekt ma już domyślną witrynę Hosting. Pomiń pozostałą część tego kroku i przejdź do następnego: Utwórz nową wersję witryny.

    • Jeśli otrzymasz pusty tablicę, oznacza to, że nie masz domyślnej witryny Hosting. Wykonaj pozostałą część tego kroku.

  2. Wybierz SITE_ID dla domyślnej witryny Hosting. Podczas podejmowania tej decyzji pamiętaj o tych kwestiach:SITE_ID

    • Ten SITE_ID służy do tworzenia domyślnych subdomen Firebase:
      SITE_ID.web.app i SITE_ID.firebaseapp.com.

    • SITE_ID musi spełniać te wymagania:

      • Musi to być prawidłowa etykieta nazwy hosta, co oznacza, że nie może zawierać znaków ., _ itp.
      • Maksymalna liczba znaków to 30.
      • Musi być niepowtarzalna globalnie w Firebase.

    Pamiętaj, że często zalecamy używanie identyfikatora projektu jako SITE_ID domyślnej witryny Hosting. Dowiedz się, jak znaleźć ten identyfikator w artykule Informacje o projektach Firebase.

  3. Utwórz domyślną witrynę Hosting, wywołując punkt końcowy sites.create, podając jako parametr siteId wybraną wartość SITE_ID.

    Przykład:

    Polecenie cURL

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

    Żądanie HTTPS w postaci zwykłego tekstu

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

    To wywołanie interfejsu API sites.create zwraca następujący ciąg znaków JSON:

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

Krok 3. Utwórz nową wersję witryny

Pierwsze wywołanie interfejsu API służy do utworzenia nowego Version dla witryny. W dalszej części tego przewodnika prześlesz pliki do tej wersji, a potem wdrożysz ją w swojej witrynie.

  1. Określ wartość SITE_ID dla witryny, w której chcesz wdrożyć usługę.

  2. Wywołaj punkt końcowy versions.create, podając w wywołaniu parametr SITE_ID.

    (Opcjonalnie) Możesz też przekazać w wywołaniu Firebase Hostingobiekt konfiguracji, w tym ustawić nagłówek, który przechowuje w pamięci podręcznej wszystkie pliki przez określony czas.

    Przykład:

    Polecenie 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
    

    Żądanie HTTPS w postaci zwykłego tekstu

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

To wywołanie interfejsu API versions.create zwraca następujący ciąg znaków JSON:

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

Ta odpowiedź zawiera niepowtarzalny identyfikator nowej wersji w formacie: sites/SITE_ID/versions/VERSION_ID. W całym tym przewodniku będziesz potrzebować tego unikalnego identyfikatora, aby odwoływać się do tej konkretnej wersji.

Krok 4. Określ listę plików, które chcesz wdrożyć

Teraz, gdy masz już identyfikator nowej wersji, musisz określić, Firebase Hostingktóre pliki chcesz wdrożyć w tej nowej wersji.

Pamiętaj, że Hosting ma maksymalny rozmiar 2 GB dla poszczególnych plików.

Ten interfejs API wymaga identyfikowania plików za pomocą skrótu SHA-256. Zanim więc wykonasz wywołanie interfejsu API, musisz najpierw obliczyć skrót dla każdego pliku statycznego, skompresować pliki, a następnie obliczyć skrót SHA256 dla każdego nowo skompresowanego pliku.

Wróćmy do naszego przykładu. Załóżmy, że chcesz wdrożyć 3 pliki w nowej wersji: file1, file2 i file3.

  1. Zgłoś pliki:

    gzip file1 && gzip file2 && gzip file3

    Masz teraz 3 skompresowane pliki: file1.gz, file2.gzfile3.gz.

  2. Uzyskaj identyfikator SHA256 każdego skompresowanego pliku:

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

    Masz teraz 3 hasze SHA256 3 skompresowanych plików.

  3. Prześlij te 3 hasze w żądaniu interfejsu API do punktu końcowego versions.populateFiles. Wypisz każdy hash według ścieżki do przesłanego pliku (w tym przykładzie /file1, /file2 i /file3).

    Przykład:

    Polecenie 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
    

    Żądanie HTTPS w postaci zwykłego tekstu

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

To wywołanie interfejsu API versions.populateFiles zwraca następujący ciąg znaków JSON:

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

Ta odpowiedź zawiera:

  • Hash każdego pliku, który należy przesłać. Na przykład w tym przykładzie file1 zostało już przesłane w poprzedniej wersji, więc jego hasz nie jest uwzględniony na liście uploadRequiredHashes.

  • uploadUrl, który jest specyficzny dla nowej wersji.

Aby w następnym kroku przesłać 2 nowe pliki, musisz mieć hashe i uploadURL z odpowiedzi versions.populateFiles.

Krok 5. Prześlij wymagane pliki

Każdy wymagany plik (czyli pliki wymienione w sekcji uploadRequiredHashes w odpowiedzi versions.populateFiles z poprzedniego kroku) musisz przesłać osobno. Aby przesłać te pliki, musisz mieć hasze plików i uploadUrl z poprzedniego kroku.

  1. Dodaj ukośnik skierowany w prawo i hasz pliku do uploadUrl, aby utworzyć adres URL odnoszący się do konkretnego pliku w formacie: https://upload-firebasehosting.googleapis.com/upload/sites/SITE_ID/versions/VERSION_ID/files/FILE_HASH.

  2. Przesyłaj wszystkie wymagane pliki pojedynczo (w tym przykładzie tylko file2.gz i file3.gz) do adresu URL konkretnego pliku, używając serii żądań.

    Aby na przykład przesłać skompresowany plik file2.gz:

    Polecenie 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
    

    Żądanie HTTPS w postaci zwykłego tekstu

    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

Pomyślnie przesłane pliki zwracają odpowiedź HTTPS 200 OK.

Krok 6. Zaktualizuj stan wersji na ZATWIERDZONY.

Po przesłaniu wszystkich plików wymienionych w odpowiedzi versions.populateFiles możesz zaktualizować stan wersji na FINALIZED.

Wywołaj punkt końcowy versions.patch, w którego żądaniu API pole status jest ustawione na FINALIZED.

Przykład:

Polecenie 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

Żądanie HTTPS w postaci zwykłego tekstu

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

To wywołanie interfejsu API versions.patch zwraca następujący ciąg znaków JSON. Sprawdź, czy status zostało zaktualizowane do 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"
}

Krok 7. Opublikuj wersję do wdrożenia

Teraz, gdy masz już ostateczną wersję, możesz ją wdrożyć. W tym kroku musisz utworzyć wersję Release, która zawiera konfigurację hostingu i wszystkie pliki treści nowej wersji.

Aby utworzyć wersję, wywołaj punkt końcowy releases.create.

Przykład:

Polecenie 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

Żądanie HTTPS w postaci zwykłego tekstu

Host: firebasehosting.googleapis.com

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

To wywołanie interfejsu API releases.create zwraca następujący ciąg znaków 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"
}

Konfiguracja hostingu i wszystkie pliki nowej wersji powinny zostać wdrożone do Twojej witryny. Możesz uzyskać dostęp do plików za pomocą adresów URL:

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

Te pliki są też dostępne pod adresami URL powiązanymi z Twoją domeną SITE_ID.firebaseapp.com.

Nową wersję znajdziesz też w panelu Hosting konsoli Firebase.