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

Firebase HostingInterfejs REST API umożliwia programowe i dostosowywane wdrażanie w witrynach hostowanych w Firebase. Użyj tego interfejsu API REST, aby wdrożyć nowe lub zaktualizowane treści Hosting i konfigurację.

Zamiast używać do wdrażania interfejsu wiersza poleceń Firebase, 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ć ją w witrynie.

Na przykład za pomocą interfejsu Firebase Hosting REST API możesz:

  • Planuj wdrożenia. Używając interfejsu REST API w połączeniu z zadaniem cron, możesz regularnie zmieniać treści hostowane w Firebase (np. wdrażać specjalną wersję treści związaną ze świętami lub wydarzeniami).

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

  • Automatyzacja wdrażania po wygenerowaniu treści statycznych. Gdy proces generuje statyczne treści programowo (np. treści użytkowników, takie jak wiki lub artykuł prasowy), możesz wdrożyć wygenerowane treści jako pliki statyczne zamiast udostępniać je dynamicznie. Pozwala to zaoszczędzić kosztowną moc obliczeniową i skalowalnie udostępniać pliki.

W tym przewodniku najpierw opisujemy, jak włączyć interfejs API, uwierzytelnić się i autoryzować. Następnie w tym przewodniku znajdziesz przykład tworzenia Firebase Hostingwersji, przesyłania do niej wymaganych plików i wdrażania jej.

Więcej informacji o tym interfejsie API typu REST znajdziesz w pełnej Hosting dokumentacji API.

Zanim zaczniesz: włączanie interfejsu API REST

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

  1. Otwórz Firebase Hostingstronę interfejsu API w konsoli interfejsów API Google.

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

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

Krok 1. Uzyskaj token dostępu do uwierzytelniania i autoryzowania żądań 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 zaufanego środowiska. Jeśli tworzysz kod lokalnie lub wdrażasz aplikację lokalnie, możesz użyć danych logowania uzyskanych za pomocą tego konta usługi do autoryzowania żądań serwera.

Wszystkie konta usługi w projekcie w Firebase możesz wyświetlić na karcie Ustawienia > Konta usługi.

Aby uwierzytelnić konto usługi i przyznać mu uprawnienia dostępu 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 kartę Ustawienia > Konta usługi.

  2. Kliknij Wygeneruj nowy klucz prywatny, a potem potwierdź, klikając Wygeneruj klucz.

  3. Bezpiecznie przechowuj plik JSON zawierający klucz.

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

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 internetowego JSON (JWT). Więcej informacji znajdziesz w sekcji 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 Twój projekt ma domyślną Hosting witrynę

Przed pierwszym wdrożeniem w Firebase Hosting Twój projekt w Firebase musi mieć domyślny Hosting SITE.

  1. Sprawdź, czy projekt ma już domyślną witrynę Hosting, wywołując 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
    

    Surowe żądanie HTTPS

    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 wartość "type": "DEFAULT_SITE", oznacza to, że projekt ma już domyślną witrynę Hosting. Pomiń pozostałą część tego kroku i przejdź do następnego: Tworzenie nowej wersji witryny.

    • Jeśli otrzymasz pustą tablicę, oznacza to, że nie masz domyślnej witryny Hosting. Wykonaj pozostałe czynności.

  2. Określ SITE_ID dla domyślnej Hosting witryny. Podejmując decyzję w tej sprawie, pamiętaj o tych kwestiach:SITE_ID

    • Ten SITE_IDjest używany 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.
      • Nie może mieć więcej niż 30 znaków
      • Musi być globalnie niepowtarzalny w Firebase.

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

  3. Utwórz domyślną witrynę Hosting, wywołując punkt końcowy sites.create i używając wybranego parametru SITE_ID jako parametru siteId.

    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
    

    Surowe żądanie HTTPS

    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 ten plik 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 polega na utworzeniu nowego Version dla Twojej witryny. W dalszej części tego przewodnika prześlesz pliki do tej wersji, a następnie wdrożysz ją w swojej witrynie.

  1. Określ SITE_ID witryny, w której chcesz wdrożyć aplikację.

  2. Wywołaj punkt końcowy versions.create, używając w wywołaniu swojego SITE_ID.

    (Opcjonalnie) Możesz też przekazać w wywołaniu Firebase Hosting obiekt konfiguracji, w tym ustawić nagłówek, który buforuje 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
    

    Surowe żądanie HTTPS

    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 ten plik JSON:

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

Odpowiedź zawiera unikalny identyfikator nowej wersji w formacie:sites/SITE_ID/versions/VERSION_ID. Ten unikalny identyfikator będzie potrzebny w całym przewodniku, 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 Hosting, które pliki chcesz ostatecznie wdrożyć w tej nowej wersji.

Pamiętaj, że maksymalny rozmiar pojedynczego pliku na Hosting to 2 GB.

Ten interfejs API wymaga identyfikowania plików za pomocą skrótu SHA256. Zanim wywołasz interfejs API, musisz obliczyć skrót każdego pliku statycznego, kompresując pliki za pomocą gzip, a następnie obliczając skrót SHA256 każdego nowo skompresowanego pliku.

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

  1. Skompresuj pliki za pomocą gzip:

    gzip file1 && gzip file2 && gzip file3

    Masz teraz 3 pliki skompresowane: file1.gz, file2.gz i file3.gz.

  2. Pobierz 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 wartości skrótu SHA256 3 skompresowanych plików.

  3. Wyślij te trzy wartości skrótu w żądaniu do interfejsu API do punktu końcowego versions.populateFiles. Wymień każdy hasz według żądanej ścieżki 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
    

    Nieprzetworzone żądanie HTTPS

    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 ten plik 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 ma zostać przesłany. Na przykład w tym przykładzie plik file1 został już przesłany w poprzedniej wersji, więc jego hash nie jest uwzględniony na liście uploadRequiredHashes.

  • uploadUrl, która jest specyficzna dla nowej wersji.

W następnym kroku przesyłania 2 nowych plików będziesz potrzebować skrótów i uploadURL z odpowiedzi versions.populateFiles.

Krok 5. Prześlij wymagane pliki

Musisz przesłać każdy wymagany plik osobno (pliki wymienione w uploadRequiredHashes w odpowiedzi versions.populateFiles z poprzedniego kroku). W przypadku tych plików musisz mieć hasze plików i uploadUrl z poprzedniego kroku.

  1. Dołącz do uploadUrl ukośnik i hash pliku, aby utworzyć adres URL konkretnego pliku w formacie:https://upload-firebasehosting.googleapis.com/upload/sites/SITE_ID/versions/VERSION_ID/files/FILE_HASH.

  2. Prześlij wszystkie wymagane pliki jeden po drugim (w tym przykładzie tylko file2.gz i file3.gz) na adres URL konkretnego pliku za pomocą 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
    

    Nieprzetworzone żądanie HTTPS

    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

Przesłanie zakończone powodzeniem zwraca odpowiedź HTTPS 200 OK.

Krok 6. Zmień stan wersji na FINALIZED (ZAKOŃCZONA)

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

Wywołaj punkt końcowy versions.patch, ustawiając w żądaniu do interfejsu API pole status 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

Nieprzetworzone żądanie HTTPS

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 ten kod JSON. Sprawdź, czy urządzenie status zostało zaktualizowane do wersji 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. Wdróż wersję

Gdy wersja będzie gotowa, opublikuj ją, aby można było ją wdrożyć. W tym kroku musisz utworzyć Release swojej wersji, która zawiera konfigurację hostingu i wszystkie pliki treści dla nowej wersji.

Wywołaj punkt końcowy releases.create, aby utworzyć wersję.

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

Nieprzetworzone żądanie HTTPS

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 ten plik 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 być teraz wdrożone w Twojej witrynie. 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.

Nowa wersja powinna być też widoczna w Hostingpanelu w Firebasekonsoli.