Autorizza le richieste di invio

Le richieste inviate a FCM dal server dell'app o dall'ambiente attendibile devono essere autorizzate. Nota queste importanti differenze tra l'autorizzazione dell'API HTTP legacy e HTTP v1:

  • L'API HTTP v1 di FCM autorizza le richieste con un token di accesso OAuth 2.0 di breve durata. Per coniare questo token, puoi utilizzare le credenziali predefinite dell'applicazione Google (negli ambienti server di Google) e/o ottenere manualmente le credenziali richieste da un file di chiave privata JSON generato per un account di servizio. Se stai utilizzando Firebase Admin SDK per inviare messaggi, la libreria gestisce il token per te.
  • I protocolli legacy possono utilizzare solo chiavi API di lunga durata ottenute dalla console Firebase.

Autorizza le richieste di invio HTTP v1

A seconda dei dettagli del tuo ambiente server, utilizza una combinazione di queste strategie per autorizzare le richieste del server ai servizi Firebase:

  • Credenziali predefinite dell'applicazione Google (ADC)
  • Un file JSON dell'account di servizio
  • Un token di accesso OAuth 2.0 di breve durata derivato da un account di servizio

Se l'applicazione è in esecuzione su Compute Engine, Google kubernetes Engine, App Engine, o cloud funzioni (comprese le funzioni cloud per Firebase), Usa credenziali applicazione predefinita (ADC). ADC utilizza l'account predefinito del servizio esistente per ottenere le credenziali di autorizzare le richieste, e ADC consente sperimentazione locale flessibile tramite la variabile d'ambiente GOOGLE_APPLICATION_CREDENTIALS . Per la massima automazione del flusso di autorizzazione, utilizzare ADC insieme alle librerie del server Admin SDK.

Se l'applicazione è in esecuzione su un ambiente di server non-Google, avrete bisogno di scaricare un file JSON account di servizio dal progetto Firebase. Finché si ha accesso a un file system che contiene il file della chiave privata, è possibile utilizzare la variabile d'ambiente GOOGLE_APPLICATION_CREDENTIALS di autorizzare le richieste con queste credenziali ottenute manualmente. Se non si dispone di tale accesso ai file, è necessario fare riferimento al file dell'account di servizio nel codice, operazione che dovrebbe essere eseguita con estrema attenzione a causa del rischio di esporre le proprie credenziali.

Fornire le credenziali utilizzando ADC

Google Application Default Credentials (ADC) verifica le tue credenziali nel seguente ordine:

  1. Controlli ADC se la variabile ambiente GOOGLE_APPLICATION_CREDENTIALS è impostato. Se la variabile è impostata, ADC utilizza il file dell'account di servizio a cui fa riferimento la variabile.

  2. Se la variabile di ambiente non è impostata, ADC utilizza l'account di servizio predefinito fornito da Compute Engine, Google Kubernetes Engine, App Engine e Cloud Functions per le applicazioni eseguite su tali servizi.

  3. Se ADC non può utilizzare nessuna delle credenziali di cui sopra, il sistema genera un errore.

Il seguente esempio di codice Admin SDK illustra questa strategia. L'esempio non specifica in modo esplicito le credenziali dell'applicazione. Tuttavia, ADC è in grado di trovare implicitamente le credenziali finché la variabile di ambiente è impostata o finché l'applicazione è in esecuzione su Compute Engine, Google Kubernetes Engine, App Engine o Cloud Functions.

Nodo.js

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

Giava

FirebaseOptions options = FirebaseOptions.builder()
    .setCredentials(GoogleCredentials.getApplicationDefault())
    .setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/")
    .build();

FirebaseApp.initializeApp(options);

Pitone

default_app = firebase_admin.initialize_app()

Partire

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

Fornisci le credenziali manualmente

Progetti Firebase supportano Google account di servizio , che è possibile utilizzare per chiamare le API di server Firebase dal server app o ambiente attendibile. Se stai sviluppando codice in locale o distribuendo la tua applicazione in locale, puoi usare le credenziali ottenute tramite questo account di servizio per autorizzare le richieste del server.

Per autenticare un account di servizio e autorizzarlo ad accedere ai servizi Firebase, devi generare un file di chiave privata in formato JSON.

Per generare un file di chiave privata per il tuo account di servizio:

  1. Nella console Firebase, aprire Impostazioni> Account di servizio .

  2. Fare clic su Genera nuova chiave privata, quindi confermare facendo clic su Genera chiave.

  3. Archivia in modo sicuro il file JSON contenente la chiave.

Quando si autorizza tramite un account di servizio, sono disponibili due opzioni per fornire le credenziali alla propria applicazione. O si può impostare la GOOGLE_APPLICATION_CREDENTIALS variabile d'ambiente, oppure si può passare in modo esplicito il percorso della chiave account di servizio nel codice. La prima opzione è più sicura ed è fortemente consigliata.

Per impostare la variabile d'ambiente:

Impostare la variabile d'ambiente GOOGLE_APPLICATION_CREDENTIALS al percorso del file JSON che contiene il codice di account di servizio. Questa variabile si applica solo alla tua sessione di shell corrente, quindi se apri una nuova sessione, imposta di nuovo la variabile.

Linux o macOS

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

finestre

Con PowerShell:

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

Dopo aver completato i passaggi precedenti, Application Default Credentials (ADC) è in grado di determinare implicitamente le tue credenziali, consentendoti di utilizzare le credenziali dell'account di servizio durante il test o l'esecuzione in ambienti non Google.

Usa le credenziali per coniare i token di accesso

A meno che non si sta utilizzando l' Admin SDK , che l'autorizzazione manico automaticamente, avrete bisogno di menta il token di accesso e inserirlo per inviare le richieste.

Utilizzare le credenziali Firebase insieme al Auth Biblioteca di Google per la vostra lingua preferita per recuperare una vita breve accesso OAuth 2.0 token:

nodo.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 questo esempio, la libreria client dell'API di Google autentica la richiesta con un token web JSON o JWT. Per ulteriori informazioni, vedere JSON gettoni web .

Pitone

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

Giava

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

Dopo la scadenza del token di accesso, viene chiamato automaticamente il metodo di aggiornamento del token per recuperare un token di accesso aggiornato.

Per autorizzare l'accesso a FCM, richiedere l'ambito https://www.googleapis.com/auth/firebase.messaging .

Per aggiungere il token di accesso a un'intestazione di richiesta HTTP:

Aggiungere il token come il valore della Authorization intestazione nel formato Authorization: Bearer <access_token> :

nodo.js

headers: {
  'Authorization': 'Bearer ' + accessToken
}

Pitone

headers = {
  'Authorization': 'Bearer ' + _get_access_token(),
  'Content-Type': 'application/json; UTF-8',
}

Giava

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;

Autorizza le richieste di invio del protocollo legacy

Con il protocollo HTTP legacy, ogni richiesta deve contenere la chiave del server dalla nube di messaggistica scheda del riquadro Firebase console Impostazioni. Per XMPP, è necessario utilizzare la stessa chiave del server per stabilire una connessione.

Migra le chiavi del server legacy

A partire da marzo 2020, FCM ha interrotto la creazione di chiavi server legacy. Esistenti chiavi del server legacy continuerà a funzionare, ma si consiglia di utilizzare invece la versione più recente del tasto corrispondente chiave Server nella console Firebase .

Se si desidera eliminare una chiave del server legacy esistente, è possibile farlo in Google Cloud Console .

Autorizza le richieste HTTP

Una richiesta di messaggio è composta da due parti: l'intestazione HTTP e il corpo HTTP. L'intestazione HTTP deve contenere le seguenti intestazioni:

  • Authorization : key = YOUR_SERVER_KEY
    Assicurarsi che questa è la chiave del server, il cui valore è disponibile nel cloud di messaggistica scheda del riquadro Firebase console Impostazioni. Le chiavi Android, iOS e browser vengono rifiutate da FCM.
  • Content-Type : application/json per JSON; application/x-www-form-urlencoded;charset=UTF-8 per il testo normale.
    Se Content-Type viene omesso, il formato si presume essere testo normale.

Per esempio:

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

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

Vedi richieste di costruzione di invio per tutti i dettagli sulla creazione di richieste di inviare. Il Legacy HTTP Protocollo di riferimento fornisce un elenco di tutti i parametri il tuo messaggio può contenere.

Verifica della validità di una chiave del server

Se ricevi errori di autenticazione durante l'invio dei messaggi, controlla la validità della tua chiave Server. Ad esempio, su Linux, esegui il seguente comando:

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

Se ricevi un codice di stato HTTP 401, la tua chiave del server non è valida.

Autorizza una connessione XMPP

Con XMPP, puoi mantenere una connessione persistente, asincrona e bidirezionale ai server FCM. La connessione può essere utilizzata per inviare e ricevere messaggi tra il tuo server e i dispositivi connessi a FCM dei tuoi utenti.

È possibile utilizzare la maggior parte delle librerie XMPP per gestire una connessione di lunga durata a FCM. XMPP endpoint funziona a fcm-xmpp.googleapis.com:5235 . Durante il test funzionalità con utenti non di produzione, si dovrebbe invece la connessione al server di pre-produzione a fcm-xmpp.googleapis.com:5236 (notare la diversa porto).

I test regolari sulla pre-produzione (un ambiente più piccolo in cui vengono eseguite le build FCM più recenti) sono utili per isolare gli utenti reali dal codice di test. Dispositivi di prova e il codice di prova per il collegamento fcm-xmpp.googleapis.com:5236 dovrebbero usare un diverso ID FCM del mittente per evitare qualsiasi rischio di invio di messaggi di prova per gli utenti di produzione o di invio di messaggi a monte dal traffico su connessioni produzione di prova.

La connessione ha due requisiti importanti:

  • È necessario avviare una connessione Transport Layer Security (TLS). Si noti che FCM attualmente non supporta l' estensione STARTTLS .
  • FCM richiede un meccanismo di autenticazione SASL PLAIN utilizzando <your_FCM_Sender_Id>@fcm.googleapis.com (FCM ID del mittente ) e la chiave del server come password. Questi valori sono disponibili nella cloud di messaggistica scheda del riquadro Firebase console Impostazioni.

Se in qualsiasi momento la connessione fallisce, dovresti riconnetterti immediatamente. Non è necessario tornare indietro dopo una disconnessione che si verifica dopo l'autenticazione. Per ogni ID mittente , FCM consente 2500 connessioni in parallelo.

I seguenti frammenti illustrano come eseguire l'autenticazione e l'autorizzazione per una connessione XMPP a FCM.

Server XMPP

Il server XMPP richiede una connessione a FCM

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

FCM

FCM apre la connessione e richiede un meccanismo di autenticazione, incluso il PLAIN metodo.

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

Server XMPP

Il server XMPP deve rispondere utilizzando il PLAIN metodo di autenticazione, che fornisce la chiave del server dalla nube di messaggistica scheda del riquadro Firebase console Impostazioni.

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

FCM

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

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

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

Nota: FCM non utilizza la risorsa associata durante l'instradamento dei messaggi.

Vedi richieste di costruzione di invio per tutti i dettagli sulla creazione di richieste di inviare. Il Legacy XMPP protocollo di riferimento fornisce un elenco di tutti i parametri il tuo messaggio può contenere.