Autoryzuj wysyłanie żądań

Żądania wysyłane do FCM z serwera aplikacji lub zaufanego środowiska muszą być autoryzowane. Zwróć uwagę na te ważne różnice między starszą autoryzacją HTTP i HTTP v1 API:

  • Interfejs API FCM HTTP v1 autoryzuje żądania za pomocą krótkotrwałego tokena dostępu OAuth 2.0. Aby wybić ten token, możesz użyć domyślnych danych logowania aplikacji Google (w środowiskach serwerów Google) i/lub ręcznie uzyskać wymagane dane logowania z pliku klucza prywatnego JSON wygenerowanego dla konta usługi. Jeśli używasz pakietu Firebase Admin SDK do wysyłania wiadomości, biblioteka obsługuje token za Ciebie.
  • Starsze protokoły mogą używać tylko długowiecznych kluczy API uzyskanych z konsoli Firebase.

Autoryzuj żądania wysyłania HTTP v1

W zależności od szczegółów środowiska serwera użyj kombinacji tych strategii, aby autoryzować żądania serwera do usług Firebase:

  • Domyślne poświadczenia aplikacji Google (ADC)
  • Plik JSON konta usługi
  • Krótkotrwały token dostępu OAuth 2.0 pochodzący z konta usługi

Jeśli aplikacja jest uruchomiona na Compute Engine, Google Kubernetes Engine, App Engine, czy chmura funkcje (w tym funkcje Chmura Firebase), poświadczenia domyślne użycie aplikacji (ADC). ADC wykorzystuje istniejące konto domyślne serwisowym w celu uzyskania referencji do żądania autoryzacji, a ADC umożliwia elastyczne testowanie lokalnego poprzez zmienną środowiskową GOOGLE_APPLICATION_CREDENTIALS . Aby uzyskać pełną automatyzację przepływu autoryzacji, użyj ADC wraz z bibliotekami serwera Admin SDK.

Jeśli aplikacja jest uruchomiona w środowisku serwerów spoza Google, musisz pobrać plik JSON konta usługi od projektu Firebase. Tak długo, jak masz dostęp do systemu plików zawierającego plik klucza prywatnego, można użyć zmiennej środowiskowej GOOGLE_APPLICATION_CREDENTIALS autoryzować wnioski z tych ręcznie uzyskanych mandatów. Jeśli nie masz takiego dostępu do pliku, musisz odwołać się do pliku konta usługi w swoim kodzie — co należy zrobić ze szczególną ostrożnością ze względu na ryzyko ujawnienia swoich poświadczeń.

Podaj dane uwierzytelniające za pomocą ADC

Domyślne poświadczenia aplikacji Google (ADC) sprawdzają Twoje dane logowania w następującej kolejności:

  1. Kontrole ADC czy zmienna środowisko GOOGLE_APPLICATION_CREDENTIALS jest ustawiony. Jeśli zmienna jest ustawiona, ADC używa pliku konta usługi, na który wskazuje zmienna.

  2. Jeśli zmienna środowiskowa nie jest ustawiona, ADC używa domyślnego konta usługi, które Compute Engine, Google Kubernetes Engine, App Engine i Cloud Functions udostępniają aplikacjom uruchamianym w tych usługach.

  3. Jeśli ADC nie może użyć żadnego z powyższych poświadczeń, system zgłasza błąd.

Poniższy przykład kodu pakietu Admin SDK ilustruje tę strategię. W przykładzie nie określono jawnie poświadczeń aplikacji. ADC może jednak niejawnie znaleźć dane logowania, o ile ustawiona jest zmienna środowiskowa lub aplikacja działa w Compute Engine, Google Kubernetes Engine, App Engine lub Cloud Functions.

Node.js

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

Jawa

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

FirebaseApp.initializeApp(options);

Pyton

default_app = firebase_admin.initialize_app()

Udać się

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

DO#

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

Podaj dane uwierzytelniające ręcznie

Projekty Firebase obsługują Google kont usług , których można użyć, aby zadzwonić API serwera Firebase z serwera aplikacji lub zaufanym środowisku. Jeśli tworzysz kod lokalnie lub wdrażasz aplikację lokalnie, możesz użyć poświadczeń uzyskanych za pośrednictwem tego konta usługi do autoryzacji żądań serwera.

Aby uwierzytelnić konto usługi i upoważnić je do 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, otwartych Ustawienia> Konta usług .

  2. Kliknij przycisk Utwórz nowy klucz prywatny, a następnie potwierdź klikając Generowanie klucza.

  3. Bezpiecznie przechowuj plik JSON zawierający klucz.

Podczas autoryzacji za pośrednictwem konta usługi masz dwie możliwości podania danych uwierzytelniających do swojej aplikacji. Można też ustawić GOOGLE_APPLICATION_CREDENTIALS zmienną środowiskową, czy można jednoznacznie przekazać ścieżkę do klucza konta usługi w kodzie. Pierwsza opcja jest bezpieczniejsza i zdecydowanie zalecana.

Aby ustawić zmienną środowiskową:

Ustawić zmienną środowiskową GOOGLE_APPLICATION_CREDENTIALS do ścieżki pliku pliku JSON, który zawiera klucz konta usługi. Ta zmienna dotyczy tylko bieżącej sesji powłoki, więc jeśli otworzysz nową sesję, ustaw zmienną ponownie.

Linux lub macOS

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

Okna

Z PowerShellem:

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

Po wykonaniu powyższych kroków aplikacja Domyślne poświadczenia (ADC) aplikacji będzie w stanie domyślnie określić Twoje dane logowania, co pozwoli Ci używać danych logowania do konta usługi podczas testowania lub uruchamiania w środowiskach innych niż Google.

Użyj danych logowania, aby wybić tokeny dostępu

O ile nie używasz Admin SDK , których zezwolenie uchwyt automatycznie, musisz mięty dostęp do tokenu i dodać go do wysyłania żądań.

Użyj poświadczeń Firebase wraz z Auth Biblioteki Google dla preferowanego języka aby pobrać krótkotrwałą OAuth 2.0 token dostępu:

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ą tokena internetowego JSON lub JWT. Aby uzyskać więcej informacji, zobacz JSON tokeny internetowych .

Pyton

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

Jawa

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

Po wygaśnięciu tokenu dostępu metoda odświeżania tokenu jest wywoływana automatycznie w celu pobrania zaktualizowanego tokenu dostępu.

Aby zezwolić na dostęp do FCM zwrócić zakres https://www.googleapis.com/auth/firebase.messaging .

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

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

node.js

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

Pyton

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

Jawa

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

Autoryzuj żądania wysyłania starszych protokołów

Z protokołem HTTP starszych, każdy wniosek musi zawierać klucz serwera z Cloud Messaging karcie panelu Firebase konsola Ustawienia. W przypadku XMPP do ustanowienia połączenia należy użyć tego samego klucza serwera.

Przenieś starsze klucze serwera

Od marca 2020 r. FCM przestał tworzyć starsze klucze serwera. Istniejące klucze starszy serwer będzie nadal działać, ale zalecamy, aby zamiast korzystania z nowszej wersji klucza oznakowane klucz serwera w konsoli Firebase .

Jeśli chcesz usunąć istniejący klucz starszego serwera, możesz to zrobić w konsoli Google Cloud .

Autoryzuj żądania HTTP

Żądanie wiadomości składa się z dwóch części: nagłówka HTTP i treści HTTP. Nagłówek HTTP musi zawierać następujące nagłówki:

  • Authorization : key = YOUR_SERVER_KEY
    Upewnij się, że jest to klucz serwera, którego wartość jest dostępny w Cloud Messaging karcie panelu Firebase konsola Ustawienia. Klucze Androida, iOS i przeglądarki są odrzucane przez FCM.
  • Content-Type : application/json dla JSON; application/x-www-form-urlencoded;charset=UTF-8 w postaci zwykłego tekstu.
    Jeśli Content-Type zostanie pominięty, format jest przyjmowany jako zwykły tekst.

Na przykład:

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

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

Zobacz Budowa wysyłać żądania pełnego szczegółów na temat tworzenia wysyłania żądań. Legacy HTTP Protocol Reference zawiera listę wszystkich parametrów wiadomość może zawierać.

Sprawdzanie ważności klucza serwera

Jeśli otrzymujesz błędy uwierzytelniania podczas wysyłania wiadomości, sprawdź ważność klucza serwera. Na przykład w systemie Linux 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 401 HTTP, Twój klucz serwera jest nieprawidłowy.

Autoryzuj połączenie XMPP

Dzięki XMPP możesz utrzymywać trwałe, asynchroniczne, dwukierunkowe połączenie z serwerami FCM. Połączenie może być używane do wysyłania i odbierania wiadomości między Twoim serwerem a urządzeniami podłączonymi do FCM użytkowników.

Możesz użyć większości bibliotek XMPP do zarządzania długotrwałym połączeniem z FCM. XMPP punktu końcowego pracuje fcm-xmpp.googleapis.com:5235 . Podczas testowania funkcjonalności z użytkownikami nieprodukcyjnych, należy zamiast połączyć się z serwerem pre-produkcji w fcm-xmpp.googleapis.com:5236 (zwróć uwagę na inny port).

Regularne testowanie na etapie przedprodukcyjnym (mniejsze środowisko, w którym działają najnowsze kompilacje FCM) jest korzystne dla odizolowania rzeczywistych użytkowników od kodu testowego. Urządzenia testowe i kod testu łączenia fcm-xmpp.googleapis.com:5236 należy użyć innego FCM identyfikator nadawcy, aby uniknąć ryzyka wysyłanie wiadomości do użytkowników testów produkcyjnych lub wysyłania wiadomości upstream od ruchu produkcyjnego w przypadku połączeń testowych.

Połączenie ma dwa ważne wymagania:

  • Musisz zainicjować połączenie Transport Layer Security (TLS). Zauważ, że FCM aktualnie nie obsługuje rozszerzenia STARTTLS .
  • FCM wymaga SASL PLAIN mechanizmu uwierzytelniania przy użyciu <your_FCM_Sender_Id>@fcm.googleapis.com (FCM identyfikator nadawcy ) oraz klucz serwera jako hasło. Wartości te są dostępne w chmurze Messaging karcie panelu Firebase konsola Ustawienia.

Jeśli w dowolnym momencie połączenie się nie powiedzie, należy natychmiast ponownie połączyć się. Nie ma potrzeby wycofywania się po rozłączeniu, które nastąpiło po uwierzytelnieniu. Dla każdego ID nadawcy FCM pozwala 2500 połączenia równoległe.

Poniższe fragmenty kodu ilustrują sposób przeprowadzania uwierzytelniania i autoryzacji dla 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 żąda mechanizm uwierzytelniania, w tym PLAIN metody.

<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ć za pomocą PLAIN metodę uwierzytelniania, zapewniając klucza serwera z Cloud Messaging karcie panelu Firebase konsola Ustawienia.

<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 komunikatów.

Zobacz Budowa wysyłać żądania pełnego szczegółów na temat tworzenia wysyłania żądań. Legacy protokół XMPP Reference zawiera listę wszystkich parametrów wiadomość może zawierać.