Autoryzowanie żądań wysłania

Żądania wysyłane do FCM z serwera aplikacji lub zaufanego środowiska musi być autoryzowany. Zwróć uwagę na te istotne różnice między wycofanymi starsza wersja interfejsów API HTTP oraz uwierzytelniania HTTP v1 API:

  • Interfejs FCM HTTP w wersji 1 API autoryzuje żądania za pomocą: token dostępu OAuth 2.0 o ograniczonym czasie funkcjonowania. Aby wygenerować ten token, możesz użyć aplikacji Google Domyślne dane logowania (w środowiskach serwerów Google) lub uzyskane ręcznie wymagane dane logowania z pliku klucza prywatnego JSON wygenerowanego dla konta usługi. Jeśli używasz pakietu SDK Firebase Admin wysyłania wiadomości, biblioteka zajmie się tokenem za Ciebie.
  • Wycofane starsze protokoły mogą korzystać tylko z długotrwałych kluczy interfejsu API uzyskanych z poziomu konsoli Firebase.

Autoryzacja wysyłania żądań HTTP w wersji 1

W zależności od tego, środowiska serwera, użyj kombinacji tych strategii, aby autoryzować serwer żądań do usług Firebase:

  • Domyślne uwierzytelnianie aplikacji Google (ADC)
  • Plik JSON konta usługi
  • Krótkotrwały token dostępu OAuth 2.0 pozyskany z konta usługi

Jeśli Twoja aplikacja działa w Compute Engine, Google Kubernetes Engine, App Engine lub Cloud Functions (w tym Cloud Functions dla Firebase) używaj domyślnych danych logowania aplikacji (ADC). ADC używa istniejącej usługi domyślnej w celu uzyskania danych logowania do autoryzowania żądań, a ADC umożliwia elastyczne testy lokalne za pomocą zmiennej środowiskowej GOOGLE_APPLICATION_CREDENTIALS Aby zapewnić pełną automatyzację procesu autoryzacji, używaj ADC razem z bibliotekami serwera pakietu Admin SDK.

Jeśli Twoja aplikacja działa w środowisku innym niż serwer Google, musisz pobrać plik JSON konta usługi ze swojego projektu Firebase. Jeśli masz dostęp do systemu plików zawierającego pliku klucza prywatnego, można użyć zmiennej środowiskowej GOOGLE_APPLICATION_CREDENTIALS do autoryzowania żądań za pomocą ręcznie uzyskanych danych logowania. W przypadku braku taki dostęp do plików, musisz odnosić się do pliku konta usługi w swoim kodzie – co należy robić z dużą ostrożnością, ponieważ grozi to ujawnieniem Twoich osiągnięć.

Podaj dane logowania za pomocą ADC

ADC (Application Default Credentials) sprawdza Twoje dane logowania w tej kolejności:

  1. ADC sprawdza, czy zmienna środowiskowa Ustawiono: GOOGLE_APPLICATION_CREDENTIALS. Jeśli zmienna jest ustawiona, ADC używa pliku konta usługi wskazanego przez zmienną.

  2. Jeśli zmienna środowiskowa nie jest ustawiona, ADC używa domyślnego konta usługi że Compute Engine, Google Kubernetes Engine, App Engine a Cloud Functions zapewnia aplikacje działające w tych usługach.

  3. Jeśli ADC nie może użyć tych danych, system zgłasza błąd.

Poniższy przykładowy kod pakietu Admin SDK ilustruje tę strategię. Przykład nie określa bezpośrednio danych logowania do aplikacji. ADC może jednak domyślnie znaleźć dane logowania, dopóki jest ustawiona zmienna środowiskowa; lub dopóki aplikacja działa w Compute Engine, Google Kubernetes Engine, App Engine lub Cloud Functions.

Node.js

admin.initializeApp({
  credential: admin.credential.applicationDefault(),
});

Java

FirebaseOptions options = FirebaseOptions.builder()
    .setCredentials(GoogleCredentials.getApplicationDefault())
    .setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/")
    .build();

FirebaseApp.initializeApp(options);

Python

default_app = firebase_admin.initialize_app()

Go

app, err := firebase.NewApp(context.Background(), nil)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

C#

FirebaseApp.Create(new AppOptions()
{
    Credential = GoogleCredential.GetApplicationDefault(),
});

Podaj dane logowania ręcznie

Projekty Firebase obsługują Google kont usługi, które można wykorzystać do wywołania Firebase interfejsy API serwera z serwera aplikacji lub zaufanego środowiska. Jeśli tworzysz lokalnie lub lokalnie wdrażając aplikację, możesz korzystać z uzyskanych danych logowania za pośrednictwem tego konta usługi, aby autoryzować żądania serwera.

Uwierzytelnienie i autoryzacja konta usługi aby uzyskać 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.

Podczas autoryzacji za pomocą konta usługi masz 2 opcje udostępniania dane logowania do Twojej aplikacji. Możesz ustawić GOOGLE_APPLICATION_CREDENTIALS. Możesz też bezpośrednio przekazywać w kodzie ścieżkę do klucza konta usługi. Pierwsza opcja jest bezpieczniejsza i zdecydowanie zalecana.

Aby ustawić zmienną środowiskową:

Ustaw zmienną środowiskową GOOGLE_APPLICATION_CREDENTIALS do ścieżki pliku JSON zawierającego klucz konta usługi. Ta zmienna ma zastosowanie tylko do bieżącej sesji powłoki, więc jeśli otworzysz w nowej sesji, ustaw zmienną ponownie.

Linux lub macOS

export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"

Windows

Za pomocą PowerShell:

$env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\service-account-file.json"

Gdy wykonasz powyższe czynności, domyślne dane uwierzytelniające aplikacji (ADC) może niejawnie określić Twoje dane logowania, dzięki czemu możesz korzystać dane logowania do konta podczas testowania lub uruchamiania w środowiskach innych niż Google.

Używanie danych logowania do tworzenia tokenów dostępu

O ile nie używasz Pakiet Admin SDK, które automatycznie obsługują autoryzację, musisz wygenerować token dostępu i dodają go do wysyłania żądań.

Używaj danych logowania Firebase w połączeniu z: Biblioteka uwierzytelniania Google wybierz preferowany język, aby pobrać token dostępu OAuth 2.0 o ograniczonym czasie ważności:

Node.js

 function getAccessToken() {
  return new Promise(function(resolve, reject) {
    const key = require('../placeholders/service-account.json');
    const 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 API Google uwierzytelnia żądanie za pomocą token sieciowy JSON, czyli JWT. Więcej informacji: Tokeny sieciowe JSON.

Python

def _get_access_token():
  """Retrieve a valid access token that can be used to authorize requests.

  :return: Access token.
  """
  credentials = service_account.Credentials.from_service_account_file(
    'service-account.json', scopes=SCOPES)
  request = google.auth.transport.requests.Request()
  credentials.refresh(request)
  return credentials.token

Java

private static String getAccessToken() throws IOException {
  GoogleCredentials googleCredentials = GoogleCredentials
          .fromStream(new FileInputStream("service-account.json"))
          .createScoped(Arrays.asList(SCOPES));
  googleCredentials.refresh();
  return googleCredentials.getAccessToken().getTokenValue();
}

Po wygaśnięciu tokena dostępu wywoływana jest metoda odświeżania tokena automatycznie pobierze zaktualizowany token dostępu.

Aby autoryzować dostęp do FCM, poproś o zakres https://www.googleapis.com/auth/firebase.messaging

Aby dodać token dostępu do nagłówka żądania HTTP:

Dodaj token jako wartość nagłówka Authorization w formacie Authorization: Bearer <access_token>:

Node.js

headers: {
  'Authorization': 'Bearer ' + accessToken
}

Python

headers = {
  'Authorization': 'Bearer ' + _get_access_token(),
  'Content-Type': 'application/json; UTF-8',
}

Java

URL url = new URL(BASE_URL + FCM_SEND_ENDPOINT);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestProperty("Authorization", "Bearer " + getServiceAccountAccessToken());
httpURLConnection.setRequestProperty("Content-Type", "application/json; UTF-8");
return httpURLConnection;

Autoryzuj żądania wysyłania wysyłanych za pomocą starszego protokołu

W przypadku starszego protokołu HTTP każde żądanie musi zawierać klucz serwera z Karta Komunikacja w chmurze w konsoli Firebase Ustawienia panel. W przypadku XMPP musisz użyć tego samego klucza serwera do nawiązania połączenia.

Migracja starszych kluczy serwera

Od marca 2020 r. usługa FCM przestała tworzyć starsze klucze serwera. Istniejące starsze klucze serwera będą nadal działać, ale zalecamy użyj zamiast tego nowszej wersji klucza o nazwie Klucz serwera w pliku konsoli Firebase.

Jeśli chcesz usunąć starszy klucz serwera, możesz to zrobić w Konsola Google Cloud.

Autoryzacja żądań HTTP

Żądanie wiadomości składa się z 2 części: nagłówka HTTP i treści HTTP. Nagłówek HTTP musi zawierać te nagłówki:

  • Authorization: klucz=TWÓJ_KLUCZ_SERWERA
    Upewnij się, że jest to klucz server, którego wartość to dostępne w Karta Komunikacja w chmurze w panelu Ustawienia w konsoli Firebase. Klucze Androida, platformy Apple oraz przeglądarki są odrzucane przez FCM.
  • Content-Type: application/json w formacie JSON; application/x-www-form-urlencoded;charset=UTF-8 w przypadku zwykłego tekstu.
    Jeśli pominiesz właściwość Content-Type, format przyjmuje się jako zwykły tekst.

Przykład:

Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
  "data" : {
    ...
  },
}

Zobacz Szczegółowe informacje o tworzeniu żądań wysyłania znajdziesz w sekcji Wysyłanie żądań. Informacje o starszym protokole HTTP zawiera listę wszystkich parametrów, które może zawierać wiadomość.

Sprawdzanie poprawności klucza serwera

Jeśli podczas wysyłania wiadomości otrzymujesz błędy uwierzytelniania, sprawdź poprawność klucza serwera. Na przykład w Linuksie uruchom następujące polecenie:

api_key=YOUR_SERVER_KEY

curl --header "Authorization: key=$api_key" \
     --header Content-Type:"application/json" \
     https://fcm.googleapis.com/fcm/send \
     -d "{\"registration_ids\":[\"ABC\"]}"

Jeśli otrzymasz kod stanu HTTP 401, oznacza to, że klucz serwera jest nieprawidłowy.

Autoryzacja połączenia XMPP

XMPP zapewnia trwałe, asynchroniczne i dwukierunkowe połączenie z serwerami FCM. może być używane do wysyłania i odbierania wiadomości między serwerem użytkowników Urządzenia połączone z FCM.

Za pomocą większości do zarządzania długotrwałym połączeniem z FCM za pomocą bibliotek XMPP. Punkt końcowy XMPP działa fcm-xmpp.googleapis.com:5235 Podczas testowania w wersji dla użytkowników nieprodukcyjnych, należy zamiast tego połączyć się z serwerem w wersji przedprodukcyjnej pod adresem fcm-xmpp.googleapis.com:5236 (zwróć uwagę na inny port).

Regularne testy na etapie przedprodukcyjnym (w mniejszym środowisku, w którym uruchamiane są najnowsze kompilacje FCM). warto odizolować prawdziwych użytkowników od kodu testowego. Przetestuj urządzenia i sprawdź kod połączenia z Aby uniknąć ryzyka, fcm-xmpp.googleapis.com:5236 powinien użyć innego identyfikatora nadawcy FCM wysyłania wiadomości testowych do użytkowników produkcyjnych lub wysyłania wiadomości z ruchu produkcyjnego w przypadku połączeń testowych.

Połączenie ma 2 ważne wymagania:

  • Musisz zainicjować połączenie TLS. Pamiętaj, że FCM nie obsługuje obecnie rozszerzenia STARTTLS.
  • FCM wymaga mechanizmu uwierzytelniania SASL PLAIN – <your_FCM_Sender_Id>@fcm.googleapis.com (identyfikator nadawcy FCM) a klucz serwera jako hasła. Wartości te są dostępne w Karta Komunikacja w chmurze w panelu Ustawienia w konsoli Firebase.

Jeśli w którymkolwiek momencie nie uda się nawiązać połączenia, musisz natychmiast nawiązać połączenie. Nie ma potrzeby wycofywania się po rozłączeniu, które następuje po uwierzytelnianie. W przypadku każdego identyfikatora nadawcy FCM dopuszcza 2500 połączenia równolegle.

Poniższe fragmenty kodu pokazują, jak przeprowadzić uwierzytelnianie połączenia XMPP z FCM.

Serwer XMPP

Serwer XMPP żąda połączenia z FCM.

<stream:stream to="fcm.googleapis.com"
        version="1.0" xmlns="jabber:client"
        xmlns:stream="http://etherx.jabber.org/streams">

FCM

FCM otwiera połączenie i wysyła żądanie mechanizmu uwierzytelniania, w tym Metoda PLAIN.

<stream:features>
  <mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
    <mechanism>X-OAUTH2</mechanism>
    <mechanism>X-GOOGLE-TOKEN</mechanism>
    <mechanism>PLAIN</mechanism>
  </mechanisms>
</stream:features>

Serwer XMPP

Serwer XMPP musi odpowiedzieć, używając metody uwierzytelniania PLAIN, podając klucz serwera z metody Karta Komunikacja w chmurze w panelu Ustawienia w konsoli Firebase.

<auth mechanism="PLAIN"
xmlns="urn:ietf:params:xml:ns:xmpp-sasl">MTI2MjAwMzQ3OTMzQHByb2plY3RzLmdjbS5hb
mFTeUIzcmNaTmtmbnFLZEZiOW1oekNCaVlwT1JEQTJKV1d0dw==</auth>

FCM

<success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/>

Serwer XMPP

<stream:stream to="fcm.googleapis.com"
        version="1.0" xmlns="jabber:client"
        xmlns:stream="http://etherx.jabber.org/streams">

FCM

<stream:features>
  <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/>
  <session xmlns="urn:ietf:params:xml:ns:xmpp-session"/>
</stream:features>

Serwer XMPP

<iq type="set">
  <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"></bind>
</iq>

FCM

<iq type="result">
  <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
    <jid>SENDER_ID@fcm.googleapis.com/RESOURCE</jid>
  </bind>
</iq>

Uwaga: FCM nie używa powiązanego zasobu podczas routingu wiadomości.

Zobacz Szczegółowe informacje o tworzeniu żądań wysyłania znajdziesz w sekcji Wysyłanie żądań. Informacje o starszym protokole XMPP zawiera listę wszystkich parametrów, które może zawierać wiadomość.