Esegui la migrazione dalle API FCM precedenti a HTTP v1

Le app che utilizzano le API FCM legacy deprecate per HTTP e XMPP devono eseguire la migrazione all'API HTTP v1 al più presto. L'invio di messaggi (inclusi i messaggi a monte) con queste API è stato ritirato il 20 giugno 2023 e il ritiro inizierà il 22 luglio 2024.

Scopri di più sulle funzionalità interessate.

Oltre al supporto continuo e alle nuove funzionalità, l'API HTTP v1 offre questi vantaggi rispetto alle API precedenti:

  • Maggiore sicurezza tramite i token di accesso L'API HTTP v1 utilizza token di accesso di breve durata in base al modello di sicurezza OAuth2. Nel caso in cui un token di accesso diventi pubblico, può essere utilizzato in modo dannoso solo per circa un'ora prima della scadenza. I token di aggiornamento non vengono trasmessi con la stessa frequenza delle chiavi di sicurezza utilizzate nella precedente API, pertanto hanno molte meno probabilità di essere acquisiti.

  • Personalizzazione più efficiente dei messaggi su più piattaforme Per il corpo del messaggio, l'API HTTP v1 ha chiavi comuni che vanno a tutte le istanze target, oltre a chiavi specifiche della piattaforma che ti consentono di personalizzare il messaggio su più piattaforme. Ciò consente di creare "override" che inviano payload leggermente diversi a piattaforme client diverse in un singolo messaggio.

  • Più estendibile e adattabile alle nuove versioni della piattaforma client L'API HTTP v1 supporta completamente le opzioni di messaggistica disponibili sulle piattaforme Apple, Android e web. Poiché ogni piattaforma ha il proprio blocco definito nel payload JSON,FCM può estendere l'API a nuove versioni e nuove piattaforme, se necessario.

Aggiorna l'endpoint del server

L'URL dell'endpoint per l'API HTTP v1 è diverso dall'endpoint legacy per i seguenti motivi:

  • Viene eseguito il controllo delle versioni, con /v1 nel percorso.
  • Il percorso contiene l'ID progetto del progetto Firebase per la tua app, nel formato /projects/myproject-ID/. Questo ID è disponibile nella scheda Impostazioni generali del progetto della console Firebase.
  • Specifica esplicitamente il metodo send come :send.

Per aggiornare l'endpoint del server per HTTP v1, aggiungi questi elementi all'endpoint nell'intestazione delle richieste di invio.

Richieste HTTP precedenti

POST https://fcm.googleapis.com/fcm/send

Richieste XMPP precedenti

I messaggi XMPP legacy vengono inviati tramite una connessione al seguente endpoint:

fcm-xmpp.googleapis.com:5235

Dopo

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send

Aggiorna l'autorizzazione delle richieste di invio

Al posto della stringa della chiave del server utilizzata nelle richieste precedenti, le richieste di invio HTTP 1.0 richiedono un token di accesso OAuth 2.0. Se utilizzi SDK Admin per inviare messaggi, la libreria gestisce il token per te. Se utilizzi il protocollo non elaborato, ottieni il token come descritto in questa sezione e aggiungilo all'intestazione come Authorization: Bearer <valid Oauth 2.0 token>.

Prima

Authorization: key=AIzaSyZ-1u...0GBYzPu7Udno5aA

Dopo

Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

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

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

Se la tua applicazione è in esecuzione su Compute Engine, Google Kubernetes Engine, App Engine o Cloud Functions (incluso Cloud Functions for Firebase), utilizza le credenziali predefinite dell'applicazione (ADC). ADC utilizza il tuo account di servizio predefinito esistente per ottenere le credenziali per autorizzare le richieste e consente test locali flessibili tramite la variabile di ambienteGOOGLE_APPLICATION_CREDENTIALS. Per l'automazione completa del flusso di autorizzazione, utilizza ADC insieme alle librerie server di SDK Admin.

Se la tua applicazione è in esecuzione in un ambiente di server non Google, devi scaricare un file JSON dell'account di servizio dal tuo progetto Firebase. Se hai accesso a un file system contenente il file della chiave privata, puoi utilizzare la variabile d'ambiente GOOGLE_APPLICATION_CREDENTIALS per autorizzare le richieste con queste credenziali ottenute manualmente. Se non disponi di questo accesso ai file, devi fare riferimento al file dell'account di servizio nel codice, il che deve essere fatto con estrema cautela a causa del rischio di esporre le tue credenziali.

Fornisci le credenziali utilizzando ADC

Le Credenziali predefinite dell'applicazione (ADC) di Google cercano le tue credenziali nel seguente ordine:

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

  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 in esecuzione su questi servizi.

  3. Se l'ADC non riesce a utilizzare nessuna delle credenziali sopra indicate, il sistema genera un errore.

Il seguente esempio di codice dell'SDK Admin illustra questa strategia. L'esempio non specifica esplicitamente le credenziali dell'applicazione. Tuttavia, l'ADC è in grado di trovare implicitamente le credenziali purché la variabile di ambiente sia impostata o purché l'applicazione sia in esecuzione su Compute Engine, Google Kubernetes Engine, App Engine o 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()

Vai

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

I progetti Firebase supportano gli account di servizio Google, che puoi utilizzare per chiamare le API di server Firebase dal server dell'app o dall'ambiente attendibile. Se stai sviluppando codice localmente o esegui il deployment dell'applicazione on-premise, puoi utilizzare le credenziali ottenute tramite questo account di servizio per autorizzare le richieste al server.

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

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

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

  2. Fai clic su Genera nuova chiave privata, poi conferma facendo clic su Genera chiave.

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

Quando esegui l'autorizzazione tramite un account di servizio, hai due opzioni per fornire le credenziali alla tua applicazione. Puoi impostare la variabile di ambiente GOOGLE_APPLICATION_CREDENTIALS o passare esplicitamente il percorso della chiave dell'account di servizio nel codice. La prima opzione è più sicura ed è vivamente consigliata.

Per impostare la variabile di ambiente:

Imposta la variabile di ambiente GOOGLE_APPLICATION_CREDENTIALS sul percorso del file JSON contenente la chiave dell'account di servizio. Questa variabile si applica solo alla 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"

Windows

Con PowerShell:

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

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

Utilizzare le credenziali per emettere token di accesso

Utilizza le tue credenziali Firebase insieme alla libreria di autenticazione Google per la tua lingua preferita per recuperare un token di accesso OAuth 2.0 di breve durata:

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 questo esempio, la libreria client delle API di Google autentica la richiesta con un token web JSON o JWT. Per ulteriori informazioni, consulta Token web JSON.

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

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

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

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

Aggiungi il token come valore dell'intestazione Authorization nel formato 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;

Aggiorna il payload delle richieste di invio

La versione 1 di FCM HTTP introduce una modifica significativa nella struttura del payload del messaggio JSON. Innanzitutto, queste modifiche assicurano che i messaggi vengano gestiti correttamente quando vengono ricevuti su piattaforme client diverse. Inoltre, ti offrono una maggiore flessibilità per personalizzare o "sostituire" i campi dei messaggi in base alla piattaforma.

Oltre a esaminare gli esempi in questa sezione, consulta Personalizzazione di un messaggio su più piattaforme e consulta il riferimento API per acquisire familiarità con HTTP v1.

Esempio: messaggio di notifica semplice

Di seguito è riportato un confronto di un payload di notifica molto semplice, contenente solo i campi title, body e data, che mostra le differenze fondamentali tra i payload precedenti e HTTP v1.

Prima

{
  "to": "/topics/news",
  "notification": {
    "title": "Breaking News",
    "body": "New news story available."
  },
  "data": {
    "story_id": "story_12345"
  }
}

Dopo

{
  "message": {
    "topic": "news",
    "notification": {
      "title": "Breaking News",
      "body": "New news story available."
    },
    "data": {
      "story_id": "story_12345"
    }
  }
}

Esempio: dati JSON nidificati

A differenza dell'API di messaggistica precedente, l'API HTTP v1 non supporta i valori JSON nidificati nel campo data. È richiesta una conversione da JSON a stringa.

Prima

{
  ...
  "data": {
    "keysandvalues": {"key1": "value1", "key2": 123}
  }
}

Dopo

{
  "message": {
   ...
    "data": {
      "keysandvalues": "{\"key1\": \"value1\", \"key2\": 123}"
    }
  }
}

Esempio: targeting per più piattaforme

Per abilitare il targeting multipiattaforma, l'API precedente eseguiva sostituzioni nel backend. Al contrario, HTTP 1.0 fornisce blocchi di chiavi specifici della piattaforma che rendono esplicite e visibili allo sviluppatore eventuali differenze tra le piattaforme. In questo modo puoi scegliere come target più piattaforme sempre con una singola richiesta, come dimostrato nell'esempio seguente.

Prima

// Android
{
  "to": "/topics/news",
  "notification": {
    "title": "Breaking News",
    "body": "New news story available.",
    "click_action": "TOP_STORY_ACTIVITY"
  },
  "data": {
    "story_id": "story_12345"
  }
}
// Apple
{
  "to": "/topics/news",
  "notification": {
    "title": "Breaking News",
    "body": "New news story available.",
    "click_action": "HANDLE_BREAKING_NEWS"
  },
  "data": {
    "story_id": "story_12345"
  }
}

Dopo

{
  "message": {
    "topic": "news",
    "notification": {
      "title": "Breaking News",
      "body": "New news story available."
    },
    "data": {
      "story_id": "story_12345"
    },
    "android": {
      "notification": {
        "click_action": "TOP_STORY_ACTIVITY"
      }
    },
    "apns": {
      "payload": {
        "aps": {
          "category" : "NEW_MESSAGE_CATEGORY"
        }
      }
    }
  }
}

Esempio: personalizzazione con le sostituzioni della piattaforma

Oltre a semplificare il targeting multipiattaforma dei messaggi, l'API HTTP v1 offre la flessibilità di personalizzare i messaggi in base alla piattaforma.

Prima

// Android
{
  "to": "/topics/news",
  "notification": {
    "title": "Breaking News",
    "body": "Check out the Top Story.",
    "click_action": "TOP_STORY_ACTIVITY"
  },
  "data": {
    "story_id": "story_12345"
  }
}
// Apple
{
  "to": "/topics/news",
  "notification": {
    "title": "Breaking News",
    "body": "New news story available.",
    "click_action": "HANDLE_BREAKING_NEWS"
  },
  "data": {
    "story_id": "story_12345"
  }
}

Dopo

{
  "message": {
    "topic": "news",
    "notification": {
      "title": "Breaking News",
      "body": "New news story available."
    },
    "data": {
      "story_id": "story_12345"
    },
    "android": {
      "notification": {
        "click_action": "TOP_STORY_ACTIVITY",
        "body": "Check out the Top Story"
      }
    },
    "apns": {
      "payload": {
        "aps": {
          "category" : "NEW_MESSAGE_CATEGORY"
        }
      }
    }
  }
}

Esempio: targeting di dispositivi specifici

Per scegliere come target dispositivi specifici con l'API HTTP v1, fornisci il token di registrazione corrente del dispositivo nella chiave token anziché nella chiave to.

Prima

  { "notification": {
      "body": "This is an FCM notification message!",
      "title": "FCM Message"
    },
    "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
  }

Dopo

{
   "message":{
      "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
      "notification":{
        "body":"This is an FCM notification message!",
        "title":"FCM Message"
      }
   }
}

Per altri esempi e informazioni sull'API FCM HTTP v1, consulta quanto segue: