Żą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 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 for Firebase), użyj domyślnych danych logowania aplikacji (ADC). ADC używa Twojego istniejącego domyślnego konta usługi do uzyskiwania poświadczeń w celu 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 innym 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żyć 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ć z najwyższą ostrożnością ze względu na ryzyko ujawnienia poświadczeń.
Podaj poświadczenia za pomocą ADC
Google Application Default Credentials (ADC) sprawdza Twoje dane logowania w następującej kolejności:
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.
Jeśli zmienna środowiskowa nie jest ustawiona, ADC używa domyślnego konta usługi udostępnianego przez Compute Engine, Google Kubernetes Engine, App Engine i Cloud Functions dla aplikacji działających w tych usługach.
Jeśli ADC nie może użyć żadnego z powyższych poświadczeń, system zgłasza błąd.
Poniższy przykład kodu Admin SDK ilustruje tę strategię. W przykładzie nie określono jawnie poświadczeń aplikacji. ADC może jednak niejawnie znaleźć poświadczenia, 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()
Iść
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 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 autoryzować dostęp do usług Firebase, musisz wygenerować plik klucza prywatnego w formacie JSON.
Aby wygenerować plik klucza prywatnego dla swojego konta usługi:
W konsoli Firebase otwórz Ustawienia > Konta usług .
Kliknij Generuj nowy klucz prywatny , a następnie potwierdź, klikając Generuj klucz .
Bezpiecznie przechowuj plik JSON zawierający klucz.
W przypadku autoryzacji za pośrednictwem konta usługi masz dwie możliwości podania poświadczeń 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ę do pliku JSON zawierającego klucz konta usługi. Ta zmienna dotyczy tylko bieżącej sesji powłoki, więc jeśli otworzysz nową sesję, ustaw tę 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 domyślne dane logowania aplikacji (ADC) mogą niejawnie określić Twoje dane logowania, umożliwiając korzystanie z danych logowania do konta usługi podczas testowania lub uruchamiania w środowiskach innych niż Google.
Używaj poświadczeń do tworzenia tokenów dostępu
Jeśli nie korzystasz z pakietu Admin SDK , który obsługuje autoryzację automatycznie, musisz utworzyć token dostępu i dodać go do wysyłania żądań.
Użyj poświadczeń Firebase razem z Biblioteką Google Auth dla preferowanego języka, aby pobrać krótkotrwały token dostępu OAuth 2.0:
węzeł.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 = service_account.Credentials.from_service_account_file(
'service-account.json', scopes=SCOPES)
request = google.auth.transport.requests.Request()
credentials.refresh(request)
return credentials.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 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>
:
węzeł.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 starszego protokołu
W przypadku starszego protokołu HTTP każde żądanie musi zawierać klucz serwera z karty Cloud Messaging w okienku Ustawienia konsoli Firebase. W przypadku XMPP musisz użyć tego samego klucza serwera, aby ustanowić połączenie.
Przeprowadź migrację starszych kluczy serwera
Od marca 2020 r. FCM przestał tworzyć starsze klucze serwerów. Istniejące starsze klucze serwera będą nadal działać, ale zamiast tego zalecamy użycie nowszej wersji klucza oznaczonej jako Klucz serwera w konsoli Firebase .
Jeśli chcesz usunąć istniejący klucz starszego 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=TWÓJ_SERWER_KLUCZ
Upewnij się, że jest to klucz serwera , którego wartość jest dostępna na karcie Cloud Messaging w okienku Ustawienia konsoli Firebase. Android, platforma Apple i klucze 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śliContent-Type
zostanie pominięty, przyjmuje się, że format to zwykły tekst.
Na przykład:
Content-Type:application/json Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA { "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...", "data" : { ... }, }
Zobacz Tworzenie żądań wysłania , aby uzyskać szczegółowe informacje na temat tworzenia żądań wysłania. Dokumentacja starszych protokołów HTTP zawiera listę wszystkich parametrów, które może zawierać Twoja wiadomość.
Sprawdzanie ważności klucza serwera
Jeśli podczas wysyłania wiadomości pojawiają się 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, 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 służyć do wysyłania i odbierania wiadomości między serwerem a urządzeniami użytkowników podłączonymi do FCM.
Możesz użyć większości bibliotek XMPP do zarządzania długotrwałym połączeniem z FCM. Punkt końcowy XMPP działa pod fcm-xmpp.googleapis.com:5235
. Podczas testowania funkcjonalności z użytkownikami nieprodukcyjnymi należy zamiast tego połączyć się z serwerem przedprodukcyjnym pod 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ą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 obecnie nie obsługuje 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 okienku Ustawienia konsoli Firebase.
Jeśli w dowolnym momencie połączenie się nie powiedzie, 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 zezwala na 2500 połączeń równoległych.
Poniższe fragmenty ilustrują sposób przeprowadzania uwierzytelniania i autoryzacji 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 autoryzacji PLAIN
, podając klucz serwera z karty Cloud Messaging w okienku ustawień 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 komunikatów.
Zobacz Tworzenie żądań wysłania , aby uzyskać szczegółowe informacje na temat tworzenia żądań wysłania. Legacy XMPP Protocol Reference zawiera listę wszystkich parametrów, które może zawierać Twoja wiadomość.