Sendeanfragen autorisieren

Anfragen, die von Ihrem App-Server oder einer vertrauenswürdigen Umgebung an FCM gesendet werden, müssen autorisiert sein. Beachten Sie diese wichtigen Unterschiede zwischen den Legacy-HTTP-API und HTTP v1 API-Autorisierung:

  • Die FCM HTTP v1 API autorisiert Anfragen mit ein kurzlebiges OAuth 2.0-Zugriffstoken. Zum Erstellen dieses Tokens können Sie die Google-Anwendung Standardanmeldedaten (in Google-Serverumgebungen) und/oder manuell abrufen die erforderlichen Anmeldedaten Aus einer privaten JSON-Schlüsseldatei, die für ein Dienstkonto generiert wurde. Wenn Sie die Firebase Admin SDK verwenden zum Senden von Nachrichten verarbeitet, verarbeitet die Bibliothek das Token für Sie.
  • Für die eingestellten Legacy-Protokolle können nur langlebige API-Schlüssel verwendet werden, die über die Firebase-Konsole abgerufen wurden.

HTTP v1-Sendeanfragen autorisieren

Abhängig von den Details Ihres Serverumgebung verwenden, kombinieren Sie diese Strategien, um Anfragen an Firebase-Dienste:

  • Standardanmeldedaten für Google-Anwendungen (Application Default Credentials, ADC)
  • Eine JSON-Datei eines Dienstkontos
  • Ein kurzlebiges OAuth 2.0-Zugriffstoken, das von einem Dienstkonto abgeleitet wurde

Wenn Ihre Anwendung auf Compute Engine, Google Kubernetes Engine, App Engine oder Cloud Functions (einschließlich Cloud Functions for Firebase) ausgeführt wird, verwenden Sie Standardanmeldedaten für Anwendungen (Application Default Credentials, ADC). ADC verwendet Ihren vorhandenen Standarddienst Anmeldedaten zum Autorisieren von Anfragen abzurufen, und ADC aktiviert Flexible lokale Tests über die Umgebungsvariable GOOGLE_APPLICATION_CREDENTIALS Für eine umfassende Automatisierung des Autorisierungsablaufs sollten Sie ADC mit Admin SDK-Serverbibliotheken verwenden.

Wenn Ihre Anwendung in einer Nicht-Google-Serverumgebung ausgeführt wird, müssen Sie eine Dienstkonto-JSON-Datei aus Ihrem Firebase-Projekt herunterladen. Solange Sie Zugriff auf ein Dateisystem haben, das die Datei können Sie die Umgebungsvariable verwenden, GOOGLE_APPLICATION_CREDENTIALS zum Autorisieren von Anfragen mit diesen manuell abgerufenen Anmeldedaten. Wenn Sie müssen Sie in Ihrem Code auf die Dienstkontodatei verweisen. Dies sollte mit äußerster Sorgfalt erfolgen, da die Gefahr besteht, dass Ihre Anmeldedaten preisgegeben werden.

Anmeldedaten mit ADC bereitstellen

Bei Standardanmeldedaten für Google-Anwendungen (Application Default Credentials, ADC) wird in der folgenden Reihenfolge nach Ihren Anmeldedaten gesucht:

  1. ADC prüft, ob die Umgebungsvariable GOOGLE_APPLICATION_CREDENTIALS ist festgelegt. Ist die Variable festgelegt, ADC verwendet die Dienstkontodatei, auf die die Variable verweist.

  2. Wenn die Umgebungsvariable nicht festgelegt ist, verwendet ADC das Standarddienstkonto Compute Engine, Google Kubernetes Engine, App Engine, und Cloud Functions für Anwendungen, die auf diesen Diensten ausgeführt werden.

  3. Wenn ADC keine der oben genannten Anmeldedaten verwenden kann, gibt das System einen Fehler aus.

Das folgende Admin SDK-Codebeispiel veranschaulicht diese Strategie. In diesem Beispiel werden die Anmeldedaten für die Anwendung nicht explizit angegeben. ADC kann jedoch die Anmeldedaten implizit finden, solange die Umgebungsvariable festgelegt ist, oder Solange die Anwendung unter Compute Engine ausgeführt wird, Google Kubernetes Engine, App Engine oder 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(),
});

Anmeldedaten manuell angeben

Firebase-Projekte unterstützen Google-Dienstkonten, mit denen Sie Firebase-Server-APIs von Ihrem App-Server oder einer vertrauenswürdigen Umgebung aus aufrufen können. Wenn Sie Code lokal entwickeln oder Ihre Anwendung vor Ort bereitstellen, können Sie über dieses Dienstkonto abgerufene Anmeldedaten verwenden, um Serveranfragen zu autorisieren.

Wenn Sie ein Dienstkonto authentifizieren und autorisieren möchten, auf Firebase-Dienste zuzugreifen, müssen Sie eine private Schlüsseldatei im JSON-Format generieren.

So generieren Sie eine private Schlüsseldatei für Ihr Dienstkonto:

  1. Öffnen Sie in der Firebase-Konsole Einstellungen > Dienstkonten.

  2. Klicke auf Neuen privaten Schlüssel generieren und bestätige ihn durch Klicken auf Schlüssel generieren.

  3. Speichern Sie die JSON-Datei mit dem Schlüssel sicher.

Bei der Autorisierung über ein Dienstkonto haben Sie zwei Möglichkeiten, das Feld Anmeldedaten für Ihre Anwendung. Sie können entweder die Umgebungsvariable GOOGLE_APPLICATION_CREDENTIALS festlegen oder den Pfad zum Dienstkontoschlüssel explizit im Code übergeben. Die erste Option ist sicherer und wird dringend empfohlen.

So legen Sie die Umgebungsvariable fest:

Legen Sie die Umgebungsvariable GOOGLE_APPLICATION_CREDENTIALS auf den Pfad der JSON-Datei fest, die Ihren Dienstkontoschlüssel enthält. Diese Variable gilt nur für Ihre aktuelle Shell-Sitzung. Wenn Sie eine neue Sitzung öffnen, müssen Sie die Variable noch einmal festlegen.

Linux oder macOS

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

Windows

Mit PowerShell:

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

Nachdem Sie die oben genannten Schritte ausgeführt haben, können Ihre Anmeldedaten ermittelt werden, sodass Sie Anmeldedaten für Dienstkonten verwenden können, wenn Sie die Anwendung in Umgebungen testen oder ausführen, die nicht von Google stammen.

Anmeldedaten zum Generieren von Zugriffstokens verwenden

Es sei denn, Sie verwenden das Admin SDK die die Autorisierung automatisch verarbeiten, müssen Sie das Zugriffstoken und fügen Sie ihn hinzu, um Anfragen zu senden.

Firebase-Anmeldedaten zusammen mit Google Auth Library für Ihre bevorzugte Sprache, um ein kurzlebiges OAuth 2.0-Zugriffstoken abzurufen:

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);
    });
  });
}

In diesem Beispiel authentifiziert die Google API-Clientbibliothek die Anfrage mit ein JSON-Web-Token oder JWT. Weitere Informationen finden Sie unter JSON-Webtokens

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();
}

Nach Ablauf Ihres Zugriffstokens wird die Methode für die Tokenaktualisierung aufgerufen. um ein aktualisiertes Zugriffstoken abzurufen.

Fordern Sie den Bereich an, um den Zugriff auf FCM zu autorisieren https://www.googleapis.com/auth/firebase.messaging.

So fügen Sie das Zugriffstoken einem HTTP-Anfrageheader hinzu:

Fügen Sie das Token als Wert des Headers Authorization im Format hinzu 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;

Sendeanfragen des alten Protokolls autorisieren

Beim alten HTTP-Protokoll muss jede Anfrage den Serverschlüssel von die Tab „Cloud Messaging“ der Einstellungen der Firebase-Konsole . Für XMPP müssen Sie zum Herstellen einer Verbindung denselben Serverschlüssel verwenden.

Legacy-Serverschlüssel migrieren

Seit März 2020 erstellt FCM keine Legacy-Serverschlüssel mehr. Vorhandene alte Serverschlüssel funktionieren weiterhin. Wir empfehlen jedoch, stattdessen die neuere Version des Schlüssels zu verwenden, der in der Firebase-Konsole als Serverschlüssel gekennzeichnet ist.

Wenn Sie einen vorhandenen Legacy-Serverschlüssel löschen möchten, können Sie dies im Google Cloud-Konsole.

HTTP-Anfragen autorisieren

Eine Nachrichtenanfrage besteht aus zwei Teilen: dem HTTP-Header und dem HTTP-Textkörper. Der HTTP-Header muss die folgenden Header enthalten:

  • Authorization: Schlüssel=IHR_SERVER_SCHLÜSSEL
    Es muss sich um den Serverschlüssel handeln, dessen Wert verfügbar in Cloud Messaging im Bereich Einstellungen der Firebase-Konsole. Android-, Apple-Plattform- und Browserschlüssel werden von FCM abgelehnt.
  • Content-Type: application/json für JSON; application/x-www-form-urlencoded;charset=UTF-8 für Nur-Text.
    Wenn Content-Type weggelassen wird, wird das Format wird davon ausgegangen, dass es sich um Nur-Text-Dateien handelt.

Beispiel:

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

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

Ausführliche Informationen zum Erstellen von Sendeaufträgen finden Sie unter Sendeaufträge erstellen. Die Referenz zum Legacy-HTTP-Protokoll stellt eine Liste aller Parameter bereit, die Ihre Nachricht enthalten kann.

Gültigkeit eines Serverschlüssels prüfen

Wenn beim Senden von Nachrichten Authentifizierungsfehler auftreten, überprüfen Sie die Gültigkeit. Ihres Serverschlüssels. Führen Sie unter Linux beispielsweise den folgenden Befehl aus:

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\"]}"

Wenn Sie den HTTP-Statuscode 401 erhalten, ist Ihr Serverschlüssel ungültig.

XMPP-Verbindung autorisieren

Mit XMPP können Sie eine persistente, asynchrone, bidirektionale Verbindung zu FCM-Servern Die Verbindung zum Senden und Empfangen von Nachrichten zwischen deinem Server der Nutzer FCM verbundene Geräte.

Mit den meisten XMPP-Bibliotheken können Sie eine langlebige Verbindung zu FCM verwalten. XMPP-Endpunkt wird ausgeführt um fcm-xmpp.googleapis.com:5235 Wenn Sie die Funktionalität mit nicht produktionsnahen Nutzern testen, sollten Sie stattdessen eine Verbindung zum Pre-Production-Server unter fcm-xmpp.googleapis.com:5236 herstellen (beachten Sie den anderen Port).

Regelmäßige Tests in der Vorproduktion (einer kleineren Umgebung, in der die neuesten FCM-Builds ausgeführt werden) sind hilfreich, um echte Nutzer von Testcode zu isolieren. Geräte testen und Code testen, mit dem eine Verbindung hergestellt wird Für fcm-xmpp.googleapis.com:5236 sollte eine andere FCM-Absender-ID verwendet werden, um Risiken zu vermeiden das Senden von Testnachrichten an Produktionsnutzer oder des Sendens von vorgelagerten Nachrichten aus dem Produktionstraffic über Testverbindungen.

Die Verbindung hat zwei wichtige Anforderungen:

  • Sie müssen eine TLS-Verbindung (Transport Layer Security) initiieren. Beachten Sie, dass FCM unterstützt die STARTTLS-Erweiterung derzeit nicht.
  • FCM erfordert einen SASL PLAIN-Authentifizierungsmechanismus mit <your_FCM_Sender_Id>@fcm.googleapis.com (FCM Absender-ID) und den Serverschlüssel als Passwort. Diese Werte finden Sie im Bereich Einstellungen der Firebase Console auf dem Tab Cloud Messaging.

Wenn die Verbindung zu irgendeinem Zeitpunkt fehlschlägt, sollten Sie die Verbindung sofort wiederherstellen. Es ist nicht nötig, nach einer Trennung nach einer Verbindung Authentifizierung. Geben Sie für jede Absender-ID Folgendes an: FCM lässt 2.500 Verbindungen parallel zu.

Die folgenden Snippets veranschaulichen, wie die Authentifizierung und Autorisierung für eine XMPP-Verbindung zu FCM.

XMPP-Server

Der XMPP-Server fordert eine Verbindung zu FCM an.

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

FCM

FCM öffnet die Verbindung und fordert einen Authentifizierungsmechanismus an, einschließlich der Methode 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>

XMPP-Server

Der XMPP-Server muss mit der PLAIN-Authentifizierungsmethode antworten und dabei den Serverschlüssel aus dem Bereich Einstellungen der Firebase-Konsole auf dem Tab Cloud Messaging angeben.

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

FCM

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

XMPP-Server

<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>

XMPP-Server

<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>

Hinweis: FCM verwendet die gebundene Ressource beim Weiterleiten von Nachrichten nicht.

Unter Sendeaufträge erstellen finden Sie weitere Informationen zum Erstellen von Sendeaufträgen. Die Legacy XMPP Protocol Reference enthält eine Liste aller Parameter, die Ihre Nachricht enthalten kann.