Catch up on everthing we announced at this year's Firebase Summit. Learn more

Autoriser l'envoi de demandes

Les demandes envoyées à FCM depuis votre serveur d'applications ou votre environnement de confiance doivent être autorisées. Notez ces différences importantes entre l'ancienne autorisation d'API HTTP et HTTP v1 :

  • L'API FCM HTTP v1 autorise les requêtes avec un jeton d'accès OAuth 2.0 de courte durée. Pour créer ce jeton, vous pouvez utiliser les informations d'identification par défaut de l'application Google (dans les environnements de serveur Google) et/ou obtenir manuellement les informations d'identification requises à partir d'un fichier de clé privée JSON généré pour un compte de service. Si vous utilisez le SDK Firebase Admin pour envoyer des messages, la bibliothèque gère le jeton pour vous.
  • Les protocoles hérités ne peuvent utiliser que des clés API de longue durée obtenues à partir de la console Firebase.

Autoriser les requêtes d'envoi HTTP v1

Selon les détails de votre environnement de serveur, utilisez une combinaison de ces stratégies pour autoriser les demandes de serveur aux services Firebase :

  • Informations d'identification par défaut de l'application Google (ADC)
  • Un fichier JSON de compte de service
  • Un jeton d'accès OAuth 2.0 de courte durée dérivé d'un compte de service

Si votre application est en cours d' exécution sur Compute Engine, Google Kubernetes Engine, App Engine Fonctions ou Cloud (y compris les fonctions Cloud pour Firebase), l' utilisation de vérification des pouvoirs d' application par défaut (ADC). ADC utilise votre compte de service par défaut existant pour obtenir des informations d' identification pour autoriser les demandes, et ADC permet de tester locaux flexibles via la variable d'environnement GOOGLE_APPLICATION_CREDENTIALS . Pour une automatisation maximale du flux d'autorisation, utilisez ADC avec les bibliothèques de serveur Admin SDK.

Si votre application est en cours d' exécution sur un environnement de serveur non Google, vous aurez besoin de télécharger un compte de service fichier JSON de votre projet Firebase. Tant que vous avez accès à un système de fichiers contenant le fichier clé privée, vous pouvez utiliser la variable d'environnement GOOGLE_APPLICATION_CREDENTIALS pour autoriser les demandes avec ces informations d' identification obtenues manuellement. Si vous n'avez pas accès à un tel fichier, vous devez référencer le fichier du compte de service dans votre code, ce qui doit être fait avec une extrême prudence en raison du risque d'exposer vos informations d'identification.

Fournir des informations d'identification à l'aide d'ADC

Les informations d'identification par défaut de l'application Google (ADC) vérifient vos informations d'identification dans l'ordre suivant :

  1. ADC vérifie si la variable d'environnement GOOGLE_APPLICATION_CREDENTIALS est réglé. Si la variable est définie, ADC utilise le fichier de compte de service vers lequel pointe la variable.

  2. Si la variable d'environnement n'est pas définie, ADC utilise le compte de service par défaut fourni par Compute Engine, Google Kubernetes Engine, App Engine et Cloud Functions pour les applications qui s'exécutent sur ces services.

  3. Si ADC ne peut utiliser aucune des informations d'identification ci-dessus, le système renvoie une erreur.

L'exemple de code SDK Admin suivant illustre cette stratégie. L'exemple ne spécifie pas explicitement les informations d'identification de l'application. Cependant, ADC est capable de trouver implicitement les identifiants tant que la variable d'environnement est définie ou tant que l'application s'exécute sur Compute Engine, Google Kubernetes Engine, App Engine ou 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()

Aller

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

Fournir les informations d'identification manuellement

Projets Firebase soutiennent Google comptes de service , que vous pouvez utiliser pour appeler les API de serveur Firebase à partir de votre serveur d'applications ou de l' environnement de confiance. Si vous développez du code localement ou déployez votre application sur site, vous pouvez utiliser les informations d'identification obtenues via ce compte de service pour autoriser les demandes du serveur.

Pour authentifier un compte de service et l'autoriser à accéder aux services Firebase, vous devez générer un fichier de clé privée au format JSON.

Pour générer un fichier de clé privée pour votre compte de service :

  1. Dans la console Firebase, ouvrez Paramètres> Comptes de service .

  2. Cliquez sur Générer une nouvelle clé privée, puis confirmez en cliquant sur Générer la clé.

  3. Stockez en toute sécurité le fichier JSON contenant la clé.

Lors de l'autorisation via un compte de service, vous avez deux choix pour fournir les informations d'identification à votre application. Vous pouvez définir la GOOGLE_APPLICATION_CREDENTIALS variable d'environnement, ou vous pouvez passer explicitement le chemin à la clé de compte de service dans le code. La première option est plus sécurisée et est fortement recommandée.

Pour définir la variable d'environnement :

Définissez la variable d'environnement GOOGLE_APPLICATION_CREDENTIALS au chemin du fichier du fichier JSON qui contient la clé de votre compte de service. Cette variable ne s'applique qu'à votre session shell actuelle, donc si vous ouvrez une nouvelle session, définissez à nouveau la variable.

Linux ou macOS

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

les fenêtres

Avec PowerShell :

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

Une fois que vous avez terminé les étapes ci-dessus, les informations d'identification par défaut de l'application (ADC) sont capables de déterminer implicitement vos informations d'identification, vous permettant d'utiliser les informations d'identification du compte de service lors des tests ou de l'exécution dans des environnements autres que Google.

Utiliser les informations d'identification pour créer des jetons d'accès

À moins que vous utilisez le SDK d' administration , qui l' autorisation de poignée automatiquement, vous aurez besoin de menthe jeton d' accès et l' ajouter à envoyer des demandes.

Utilisez vos informations d' identification Firebase avec la bibliothèque Google Auth pour votre langue préférée pour récupérer un accès OAuth 2.0 courte durée jeton:

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

Dans cet exemple, la bibliothèque cliente de l'API Google authentifie la demande avec un jeton Web JSON ou JWT. Pour plus d' informations, consultez JSON jetons web .

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

Une fois votre jeton d'accès expiré, la méthode d'actualisation du jeton est appelée automatiquement pour récupérer un jeton d'accès mis à jour.

Pour autoriser l' accès à la FCM, demander la portée https://www.googleapis.com/auth/firebase.messaging .

Pour ajouter le jeton d'accès à un en-tête de requête HTTP :

Ajouter le jeton comme la valeur de l' Authorization en- tête dans le format d' 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;

Autoriser les demandes d'envoi de protocole hérité

Avec le protocole HTTP héritage, chaque demande doit contenir la clé du serveur à partir du nuage de messagerie onglet de la fenêtre Paramètres de la console Firebase. Pour XMPP, vous devez utiliser la même clé de serveur pour établir une connexion.

Migrer les clés de serveur héritées

À partir de mars 2020, FCM a cessé de créer des clés de serveur héritées. Clés de serveurs hérités existants continueront à travailler, mais nous vous recommandons d' utiliser plutôt la clé version plus récente de la touche marquée du serveur dans la console Firebase .

Si vous souhaitez supprimer une clé de serveur hérité existant, vous pouvez le faire dans le Google Cloud Console .

Autoriser les requêtes HTTP

Une demande de message se compose de deux parties : l'en-tête HTTP et le corps HTTP. L'en-tête HTTP doit contenir les en-têtes suivants :

  • Authorization : key = YOUR_SERVER_KEY
    Assurez - vous que c'est la clé du serveur, dont la valeur est disponible dans le nuage de messagerie onglet de la fenêtre Paramètres de la console Firebase. Android, la plate-forme Apple et les clés de navigateur sont rejetées par FCM.
  • Content-Type : application/json pour JSON; application/x-www-form-urlencoded;charset=UTF-8 pour le texte brut.
    Si Content-Type est omis, le format est supposé être le texte brut.

Par exemple:

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

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

Voir Construire Envoyer des demandes pour le détail complet sur la création d' envoyer des demandes. Le protocole HTTP héritage de référence fournit une liste de tous les paramètres de votre message peut contenir.

Vérifier la validité d'une clé de serveur

Si vous recevez des erreurs d'authentification lors de l'envoi de messages, vérifiez la validité de votre clé de serveur. Par exemple, sous Linux, exécutez la commande suivante :

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

Si vous recevez un code d'état HTTP 401, votre clé de serveur n'est pas valide.

Autoriser une connexion XMPP

Avec XMPP, vous pouvez maintenir une connexion persistante, asynchrone et bidirectionnelle aux serveurs FCM. La connexion peut être utilisée pour envoyer et recevoir des messages entre votre serveur et les appareils connectés au FCM de vos utilisateurs.

Vous pouvez utiliser la plupart des bibliothèques XMPP pour gérer une connexion de longue durée à FCM. Point final XMPP fonctionne à fcm-xmpp.googleapis.com:5235 . Lorsque la fonctionnalité des tests avec les utilisateurs non-production, vous devriez plutôt se connecter au serveur de pré-production à fcm-xmpp.googleapis.com:5236 (notez le port différent).

Des tests réguliers sur la pré-production (un environnement plus petit où s'exécutent les dernières versions de FCM) sont bénéfiques pour isoler les utilisateurs réels du code de test. Dispositifs d'essai et le code de test se connecter à fcm-xmpp.googleapis.com:5236 d' utiliser un autre ID de l' expéditeur de la FCM pour éviter tout risque d'envoyer des messages de test aux utilisateurs de production ou d' envoyer des messages en amont du trafic de production via des connexions de test.

La connexion a deux exigences importantes :

  • Vous devez initier une connexion TLS (Transport Layer Security). Notez que la FCM ne prend pas en charge l' extension STARTTLS .
  • La FCM a besoin d' un mécanisme d'authentification SASL PLAIN en utilisant <your_FCM_Sender_Id>@fcm.googleapis.com (FCM ID de l' expéditeur ) et la clé du serveur comme mot de passe. Ces valeurs sont disponibles dans le nuage de messagerie onglet de la fenêtre Paramètres de la console Firebase.

Si à tout moment la connexion échoue, vous devez immédiatement vous reconnecter. Il n'est pas nécessaire de faire marche arrière après une déconnexion qui se produit après l'authentification. Pour chaque ID de l' expéditeur , la FCM permet 2500 connexions en parallèle.

Les extraits suivants illustrent comment effectuer l'authentification et l'autorisation pour une connexion XMPP à FCM.

Serveur XMPP

Le serveur XMPP demande une connexion à FCM

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

FCM

FCM ouvre la connexion et demande un mécanisme d'authentification, y compris la PLAIN méthode.

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

Serveur XMPP

Le serveur XMPP doit répondre en utilisant la PLAIN méthode auth, fournissant la clé du serveur à partir du nuage de messagerie onglet de la fenêtre Paramètres de la console 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"/>

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

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

Remarque : FCM n'utilise pas la ressource liée lors du routage des messages.

Voir Construire Envoyer des demandes pour le détail complet sur la création d' envoyer des demandes. Le protocole XMPP héritage de référence fournit une liste de tous les paramètres de votre message peut contenir.