Sendeanfragen autorisieren

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

  • Die FCM HTTP v1-API autorisiert Anfragen mit einem kurzlebigen OAuth 2.0-Zugriffstoken. Um dieses Token zu prägen, können Sie die Standardanmeldeinformationen für Google-Anwendungen (in Google-Serverumgebungen) verwenden und/oder die erforderlichen Anmeldeinformationen manuell aus einer privaten JSON-Schlüsseldatei abrufen, die für ein Dienstkonto generiert wurde. Wenn Sie das Firebase Admin SDK zum Senden von Nachrichten verwenden, verarbeitet die Bibliothek das Token für Sie.
  • Die Legacy-Protokolle können nur langlebige API-Schlüssel verwenden, die von der Firebase-Konsole abgerufen wurden.

HTTP v1-Sendeanfragen autorisieren

Verwenden Sie je nach den Details Ihrer Serverumgebung eine Kombination dieser Strategien, um Serveranfragen an Firebase-Dienste zu autorisieren:

  • Standardanmeldeinformationen für Google-Anwendungen (ADC)
  • Eine Dienstkonto-JSON-Datei
  • Ein kurzlebiges OAuth 2.0-Zugriffstoken, das von einem Dienstkonto abgeleitet ist

Wenn Ihre Anwendung läuft auf Compute Engine, Google Kubernetes Motor, App Engine oder Cloud - Funktionen (einschließlich Cloud - Funktionen für die Firebase), die Verwendung Application Default Credentials (ADC). ADC nutzt die vorhandenen Standard - Dienstkontoinformationen zu erhalten Anfragen zu genehmigen, und ADC ermöglicht eine flexible lokale Prüfung über die Umgebungsvariable GOOGLE_APPLICATION_CREDENTIALS . Um den Autorisierungsablauf vollständig zu automatisieren, verwenden Sie ADC zusammen mit Admin SDK-Serverbibliotheken.

Wenn Ihre Anwendung auf einer Nicht-Google - Server - Umgebung ausgeführt wird , müssen Sie ein Dienstkonto JSON - Datei von Ihrem Projekt Firebase zum Download bereit . Solange Sie den Zugriff auf ein Dateisystem haben die private Schlüsseldatei enthält, können Sie die Umgebungsvariable verwenden GOOGLE_APPLICATION_CREDENTIALS auf Anfragen mit diesen manuell erhaltenen Anmeldeinformationen zu autorisieren. Wenn Sie keinen solchen Dateizugriff haben, müssen Sie in Ihrem Code auf die Dienstkontodatei verweisen. Dies sollte mit äußerster Sorgfalt erfolgen, da die Gefahr besteht, dass Ihre Anmeldeinformationen preisgegeben werden.

Geben Sie Anmeldeinformationen mit ADC . an

Google Application Default Credentials (ADC) prüft Ihre Anmeldeinformationen in der folgenden Reihenfolge:

  1. ADC überprüft , ob die Umgebungsvariable GOOGLE_APPLICATION_CREDENTIALS gesetzt. Wenn die Variable festgelegt ist, verwendet ADC die Dienstkontodatei, auf die die Variable verweist.

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

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

Das folgende Admin SDK-Codebeispiel veranschaulicht diese Strategie. Im Beispiel werden die Anmeldeinformationen der Anwendung nicht explizit angegeben. ADC kann die Anmeldedaten jedoch implizit finden, solange die Umgebungsvariable festgelegt ist oder die Anwendung auf Compute Engine, Google Kubernetes Engine, App Engine oder Cloud Functions ausgeführt wird.

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

gehen

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

Geben Sie die Anmeldeinformationen manuell ein

Firebase Projekte unterstützen Google Dienstkonten , die Sie Firebase Server aufrufen APIs von Ihrem App - Server oder vertrauenswürdigen Umgebung verwenden können. Wenn Sie Code lokal entwickeln oder Ihre Anwendung lokal bereitstellen, können Sie die über dieses Dienstkonto abgerufenen Anmeldeinformationen verwenden, um Serveranforderungen zu autorisieren.

Um ein Dienstkonto zu authentifizieren und es für den Zugriff auf Firebase-Dienste zu autorisieren, müssen Sie eine private Schlüsseldatei im JSON-Format generieren.

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

  1. In der Firebase Konsole, öffnen Sie Einstellungen> Dienstkonten .

  2. Generieren Klicken Sie auf Neu Private Key, dann bestätigen Sie Schlüssel generieren.

  3. Speichern Sie die JSON-Datei, die den Schlüssel enthält, sicher.

Bei der Autorisierung über ein Dienstkonto haben Sie zwei Möglichkeiten, die Anmeldeinformationen für Ihre Anwendung bereitzustellen. Sie können entweder die eingestellte GOOGLE_APPLICATION_CREDENTIALS Umgebungsvariable, oder Sie können explizit den Pfad zu dem Dienstkonto Schlüssel 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 Dateipfad der JSON - Datei , die Ihr Dienstkonto Schlüssel enthält. Diese Variable gilt nur für Ihre aktuelle Shell-Sitzung. Wenn Sie also eine neue Sitzung öffnen, legen Sie die Variable erneut fest.

Linux oder macOS

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

Fenster

Mit PowerShell:

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

Nachdem Sie die obigen Schritte ausgeführt haben, kann Application Default Credentials (ADC) Ihre Anmeldeinformationen implizit ermitteln, sodass Sie die Anmeldeinformationen für Dienstkonten beim Testen oder Ausführen in Umgebungen außerhalb von Google verwenden können.

Verwenden Sie Anmeldeinformationen, um Zugriffstoken zu prägen

Es sei denn , Sie verwenden Admin SDK , der Griff Genehmigung automatisch, können Sie den Zugriff auf Minze benötigen Token und fügen Sie es Anfragen zu senden.

Verwenden Sie Ihre Firebase Anmeldeinformationen zusammen mit der Google Auth - Bibliothek für die gewünschte Sprache Token einen kurzlebigen OAuth 2.0 Zugang zu erhalten:

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 einem JSON-Webtoken oder JWT. Weitere Informationen finden Sie JSON Web - Token .

Python

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

Java

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

Nachdem Ihr Zugriffstoken abgelaufen ist, wird die Tokenaktualisierungsmethode automatisch aufgerufen, um ein aktualisiertes Zugriffstoken abzurufen.

So autorisieren Sie Zugang zu FCM, fordern den Umfang https://www.googleapis.com/auth/firebase.messaging .

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

Fügen Sie die Token als Wert des Authorization - Header in dem Format 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 " + getAccessToken());
httpURLConnection.setRequestProperty("Content-Type", "application/json; UTF-8");
return httpURLConnection;

Autorisieren von Sendeanfragen für das Legacy-Protokoll

Mit dem HTTP - Protokoll Legacy muss jede Anforderung enthält den Serverschlüssel aus der Cloud Messaging - Registerkarte des Firebase Konsole Einstellungen Bereichs. Für XMPP müssen Sie denselben Serverschlüssel verwenden, um eine Verbindung herzustellen.

Migrieren von Legacy-Serverschlüsseln

Ab März 2020 hat FCM die Erstellung von Legacy-Serverschlüsseln eingestellt. Bestehende Legacy - Server Schlüssel werden an die Arbeit fortsetzen, aber wir empfehlen , dass Sie stattdessen die neuere Version von Taste mit der Bezeichnung Server - Schlüssel in der Verwendung Firebase Konsole .

Wenn Sie einen vorhandenen Legacy - Server - Schlüssel löschen möchten, können Sie dies in der tun Google Cloud Console .

HTTP-Anfragen autorisieren

Eine Nachrichtenanforderung besteht aus zwei Teilen: dem HTTP-Header und dem HTTP-Body. Der HTTP-Header muss die folgenden Header enthalten:

  • Authorization : key = YOUR_SERVER_KEY
    Stellen Sie sicher , dies ist der Server - Schlüssel, dessen Wert in der verfügbaren Cloud Messaging - Registerkarte des Firebase Konsole Einstellungen Bereich. Android-, iOS- und Browserschlüssel werden von FCM abgelehnt.
  • Content-Type : application/json für JSON; application/x-www-form-urlencoded;charset=UTF-8 für Klartext.
    Wenn Content-Type nicht angegeben, wird das Format angenommen Klartext sein.

Zum Beispiel:

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

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

Siehe Build - Sendeanforderungen für die vollständigen Einzelheiten zu senden Anfragen zu schaffen. Die Legacy - HTTP - Protokoll - Referenz enthält eine Liste aller Parameter Ihre Nachricht enthält.

Überprüfen der Gültigkeit eines Serverschlüssels

Wenn Sie beim Senden von Nachrichten Authentifizierungsfehler erhalten, überprüfen Sie die Gültigkeit Ihres Serverschlüssels. Führen Sie beispielsweise unter Linux 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 einen HTTP-Statuscode 401 erhalten, ist Ihr Serverschlüssel ungültig.

Autorisieren einer XMPP-Verbindung

Mit XMPP können Sie eine persistente, asynchrone, bidirektionale Verbindung zu FCM-Servern aufrechterhalten. Die Verbindung kann zum Senden und Empfangen von Nachrichten zwischen Ihrem Server und den mit FCM verbundenen Geräten Ihrer Benutzer verwendet werden.

Sie können die meisten XMPP-Bibliotheken verwenden, um eine langlebige Verbindung zu FCM zu verwalten. XMPP Endpunkt läuft bei fcm-xmpp.googleapis.com:5235 . Bei der Prüfung von Funktionalität mit Nicht-Produktions Benutzern, sollten Sie stattdessen an , um den Pre-Production - Server verbinden fcm-xmpp.googleapis.com:5236 ( man beachte den ander Port).

Regelmäßige Tests in der Vorproduktion (eine kleinere Umgebung, in der die neuesten FCM-Builds ausgeführt werden) sind vorteilhaft, um echte Benutzer vom Testcode zu isolieren. Testgeräte und Testcode zu verbinden fcm-xmpp.googleapis.com:5236 sollten einen anderen FCM Absender - ID verwenden , um alle Risiken des Sendens Testnachricht an Produktions Benutzer zu vermeiden oder Upstream - Nachrichten von Produktionsverkehr über Prüfanschlüsse senden.

Die Verbindung hat zwei wichtige Anforderungen:

  • Sie müssen eine Transport Layer Security (TLS)-Verbindung initiieren. Beachten Sie, dass FCM derzeit nicht die Unterstützung STARTTLS - Erweiterung .
  • FCM erfordert eine SASL PLAIN Authentifizierungsmechanismus mit <your_FCM_Sender_Id>@fcm.googleapis.com (FCM Sender - ID ) und die Server - Schlüssel als Passwort. Diese Werte sind in der Cloud Messaging - Registerkarte des Firebase Konsole Einstellungen Bereich.

Wenn die Verbindung zu irgendeinem Zeitpunkt fehlschlägt, sollten Sie die Verbindung sofort wiederherstellen. Es besteht keine Notwendigkeit, sich nach einer Trennung nach der Authentifizierung zurückzuziehen. Für jeden Sender - ID ermöglicht FCM 2500 Verbindungen parallel.

Die folgenden Ausschnitte veranschaulichen, wie Sie die Authentifizierung und Autorisierung für eine XMPP-Verbindung zu FCM durchführen.

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 eine Auth - Mechanismus, einschließlich der PLAIN Methode.

<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

Die XMPP - Server antworten muss die Verwendung PLAIN Auth Methode, den Server - Schlüssels aus der Bereitstellung von Cloud - Messaging - Registerkarte des Firebase Konsole Einstellungen Bereichs.

<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 Routing von Nachrichten nicht.

Siehe Build - Sendeanforderungen für die vollständigen Einzelheiten zu senden Anfragen zu schaffen. Die Legacy - XMPP - Protokoll - Referenz stellt eine Liste aller Parameter Ihre Nachricht enthält.