Google is committed to advancing racial equity for Black communities. See how.
Ta strona została przetłumaczona przez Cloud Translation API.
Switch to English

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 starszymi autoryzacjami HTTP i HTTP v1 API:

  • Interfejs API FCM HTTP v1 autoryzuje żądania z krótkotrwałym tokenem 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 poświadczenia z pliku klucza prywatnego JSON wygenerowanego dla konta usługi. Jeśli do wysyłania wiadomości używasz pakietu Firebase Admin SDK, biblioteka obsługuje token za Ciebie.
  • Starsze protokoły mogą używać tylko długoterminowych kluczy API uzyskanych z konsoli Firebase.

Autoryzuj żądania wysyłania HTTP v1

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

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

Jeśli Twoja aplikacja działa w Compute Engine, Kubernetes Engine, App Engine lub Cloud Functions (w tym Cloud Functions dla Firebase), użyj domyślnych danych logowania aplikacji (ADC). ADC korzysta z Twojego istniejącego domyślnego konta usługi w celu uzyskania danych uwierzytelniających w celu autoryzacji żądań, a ADC umożliwia elastyczne testowanie lokalne za pośrednictwem zmiennej środowiskowej GOOGLE_APPLICATION_CREDENTIALS . Aby w pełni zautomatyzować przepływ autoryzacji, użyj ADC razem z bibliotekami serwera Admin SDK.

Jeśli Twoja aplikacja działa w środowisku serwerowym innym niż Google , musisz pobrać plik JSON konta usługi ze swojego projektu Firebase. Dopóki masz dostęp do systemu plików zawierającego plik klucza prywatnego, możesz użyć zmiennej środowiskowej GOOGLE_APPLICATION_CREDENTIALS do autoryzacji żądań przy użyciu tych ręcznie uzyskanych danych uwierzytelniających. 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ć z najwyższą ostrożnością ze względu na ryzyko ujawnienia swoich poświadczeń.

Podaj poświadczenia za pomocą ADC

Domyślne dane logowania aplikacji Google (ADC) sprawdzają Twoje poświadczenia 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 udostępnianego przez Compute Engine, Kubernetes Engine, App Engine i Cloud Functions dla aplikacji działających 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ę. Przykład nie określa jawnie poświadczeń aplikacji. Jednak ADC jest w stanie niejawnie znaleźć poświadczenia, o ile jest ustawiona zmienna środowiskowa lub jeśli aplikacja działa w Compute Engine, Kubernetes Engine, App Engine lub Cloud Functions.

Node.js

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

Jawa

 FirebaseOptions options = new 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 poświadczenia ręcznie

Projekty Firebase obsługują konta usług 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ć poświadczeń uzyskanych za pośrednictwem 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ług .

  2. Kliknij opcję Generuj nowy klucz prywatny , a następnie potwierdź, klikając opcję Generuj 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 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 jest zdecydowanie zalecana.

Aby ustawić zmienną środowiskową:

Ustaw zmienną środowiskową GOOGLE_APPLICATION_CREDENTIALS na ścieżkę do 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"
 

Windows

Z PowerShell:

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

Po wykonaniu powyższych kroków domyślne poświadczenia aplikacji (ADC) są w stanie niejawnie określić Twoje poświadczenia, umożliwiając korzystanie z poświadczeń konta usługi podczas testowania lub uruchamiania w środowiskach innych niż Google.

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

Jeśli nie używasz pakietu Admin SDK , który automatycznie obsługuje autoryzację, musisz wydobyć token dostępu i dodać go, aby wysyłać żądania.

Użyj danych logowania Firebase razem z biblioteką klienta interfejsu API Google dla preferowanego języka, aby pobrać krótkotrwały token dostępu OAuth 2.0:

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 Google API 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 Komunikacja w chmurze w panelu Ustawienia konsoli Firebase. W przypadku XMPP do ustanowienia połączenia należy użyć tego samego klucza serwera.

Przeprowadź migrację starszych kluczy serwera

Począwszy od marca 2020 roku, FCM przestał tworzyć starsze klucze serwera. Istniejące starsze klucze serwera będą nadal działać, ale zalecamy zamiast nich użycie nowszej wersji klucza z etykietą 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 Komunikacja w chmurze w panelu Ustawienia konsoli Firebase. Klucze Androida, iOS i przeglądarki są odrzucane przez FCM.
  • Content-Type : application/json for JSON; application/x-www-form-urlencoded;charset=UTF-8 dla zwykłego tekstu.
    Jeśli pominięto Content-Type zakłada 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 Tworzenie żądań wysyłania, aby uzyskać szczegółowe informacje na temat tworzenia żądań wysyłania. Legacy HTTP Protocol Reference zawiera listę wszystkich parametrów, które może zawierać wiadomość.

Sprawdzanie ważności klucza serwera

Jeśli podczas wysyłania wiadomości otrzymujesz błędy uwierzytelniania, 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 HTTP 401, klucz serwera jest nieprawidłowy.

Autoryzuj połączenie XMPP

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

Większość bibliotek XMPP umożliwia zarządzanie 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 w fazie przedprodukcyjnej (mniejsze środowisko, w którym działają najnowsze kompilacje FCM) jest korzystne dla odizolowania prawdziwych użytkowników od kodu testowego. Urządzenia testowe i kod testowy łączący 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 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 nie powiedzie się, należy natychmiast połączyć się ponownie. Nie ma potrzeby wycofywania się po rozłączeniu, które ma miejsce po uwierzytelnieniu. Dla każdego identyfikatora nadawcy FCM umożliwia równoległe 2500 połączeń.

Poniższe fragmenty 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 odpowiedzieć przy użyciu metody uwierzytelniania PLAIN , podając klucz serwera z karty Cloud Messaging w panelu Ustawienia 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 kierowania wiadomości.

Aby uzyskać szczegółowe informacje na temat tworzenia żądań wysyłania, zobacz Tworzenie żądań wysyłania. Dokumentacja Legacy XMPP Protocol Reference zawiera listę wszystkich parametrów, które może zawierać wiadomość.