Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

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 Twoja aplikacja działa w Compute Engine, Google Kubernetes Engine, App Engine lub Cloud Functions (w tym Cloud Functions dla Firebase), użyj domyślnych poświadczeń aplikacji (ADC). ADC używa istniejącego domyślnego konta usługi do uzyskiwania poświadczeń do autoryzacji żądań, a ADC umożliwia elastyczne testowanie lokalne za pomocą zmiennej środowiskowej GOOGLE_APPLICATION_CREDENTIALS . Aby uzyskać pełną automatyzację przepływu autoryzacji, użyj ADC wraz z bibliotekami serwera Admin SDK.

Jeśli Twoja aplikacja działa w środowisku serwera innego niż Google , musisz pobrać plik JSON konta usługi z projektu Firebase. Jeśli masz dostęp do systemu plików zawierającego plik klucza prywatnego, możesz używać zmiennej środowiskowej GOOGLE_APPLICATION_CREDENTIALS aby autoryzować żądania przy użyciu tych ręcznie uzyskanych poświadczeń. 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. ADC sprawdza, czy zmienna środowiskowa GOOGLE_APPLICATION_CREDENTIALS jest ustawiona. 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łosi 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ą konta usług Google , których można 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ć poświadczeń uzyskanych za pośrednictwem tego konta usługi, aby autoryzować żądania 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 otwórz Ustawienia > Konta usług .

  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 pośrednictwem konta usługi masz dwie możliwości podania poświadczeń do swojej aplikacji. Możesz ustawić zmienną środowiskową GOOGLE_APPLICATION_CREDENTIALS lub jawnie przekazać ścieżkę do klucza konta usługi w kodzie. Pierwsza opcja jest bezpieczniejsza i zdecydowanie zalecana.

Aby ustawić zmienną środowiskową:

Ustaw zmienną środowiskową GOOGLE_APPLICATION_CREDENTIALS na ścieżkę pliku JSON, który zawiera klucz Twojego 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

Jeśli nie korzystasz z pakietu Admin SDK , który automatycznie obsługuje autoryzację, musisz wygenerować token dostępu i dodać go do wysyłania żądań.

Użyj swoich danych logowania Firebase wraz z biblioteką klienta interfejsu API Google dla preferowanego języka, aby pobrać token dostępu OAuth 2.0 o krótkim 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ą tokena internetowego JSON lub JWT. Aby uzyskać więcej informacji, zobacz tokeny internetowe JSON .

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 {
  GoogleCredential googleCredential = GoogleCredential
      .fromStream(new FileInputStream("service-account.json"))
      .createScoped(Arrays.asList(SCOPES));
  googleCredential.refreshToken();
  return googleCredential.getAccessToken();
}

Po wygaśnięciu tokenu dostępu metoda odświeżania tokenu jest wywoływana automatycznie w celu pobrania zaktualizowanego tokenu 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
}

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

W przypadku starszego protokołu HTTP każde żądanie musi zawierać klucz serwera z karty Cloud Messaging w panelu Ustawienia konsoli Firebase. 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 starsze klucze serwera będą nadal działać, ale zamiast tego zalecamy użycie nowszej wersji klucza oznaczonego jako Klucz serwera w konsoli Firebase .

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

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 : klucz=YOUR_SERVER_KEY
    Upewnij się, że jest to klucz serwera , którego wartość jest dostępna na karcie Cloud Messaging w panelu Ustawienia konsoli Firebase. Klucze Androida, iOS i przeglądarki są odrzucane przez FCM.
  • Content-Type : application/json dla JSON; application/x-www-form-urlencoded;charset=UTF-8 dla zwykłego tekstu.
    Jeśli Content-Type zostanie pominięty, przyjmuje się, że format jest zwykłym tekstem.

Na przykład:

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

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

Zobacz Żądania wysłania kompilacji, aby uzyskać szczegółowe informacje na temat tworzenia żądań wysłania. Dokumentacja starszego protokołu HTTP zawiera listę wszystkich parametrów, które może zawierać wiadomość.

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. fcm-xmpp.googleapis.com:5235 końcowy XMPP działa pod adresem fcm-xmpp.googleapis.com:5235 . Podczas testowania funkcjonalności z użytkownikami nieprodukcyjnymi należy zamiast tego połączyć się z serwerem fcm-xmpp.googleapis.com:5236 pod adresem 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 testowy łączące się z fcm-xmpp.googleapis.com:5236 powinny używać innego identyfikatora nadawcy FCM, aby uniknąć ryzyka wysyłania wiadomości testowych do użytkowników produkcyjnych lub wysyłania wiadomości nadrzędnych z ruchu produkcyjnego przez połączenia testowe.

Połączenie ma dwa ważne wymagania:

  • Musisz zainicjować połączenie Transport Layer Security (TLS). Pamiętaj, że FCM nie obsługuje obecnie rozszerzenia STARTTLS .
  • FCM wymaga mechanizmu uwierzytelniania SASL PLAIN przy użyciu <your_FCM_Sender_Id>@fcm.googleapis.com ( identyfikator nadawcy FCM ) i klucza serwera jako hasła. Te wartości są dostępne na karcie Cloud Messaging w panelu Ustawienia konsoli Firebase.

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 po uwierzytelnieniu. Dla każdego identyfikatora nadawcy FCM pozwala na 2500 równoległych połączeń.

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 mechanizmu uwierzytelniania, w tym metody 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 odpowiadać za pomocą metody uwierzytelniania PLAIN , podając klucz serwera z karty Cloud Messaging w panelu Ustawienia konsoli Firebase.

058355740

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 Build Send Requests, aby uzyskać szczegółowe informacje na temat tworzenia żądań wysyłania. Dokumentacja protokołu Legacy XMPP zawiera listę wszystkich parametrów, które może zawierać wiadomość.