Migration des anciennes API FCM vers HTTP v1

Bonjour à tous,
J’ouvre ce sujet concernant Firebase Cloud Messaging qui va mettre un terme à son API FCM.

En effet, l’API FCM va cesser de fonctionner le 20 juin 2024 et google nous demande donc de migrer vers HTTP v1 pour continuer à distribuer nos notifications push.

Tout cela est très bien documenté sur leur site (Migrer des anciennes API FCM vers HTTP v1  |  Firebase Cloud Messaging) mais pour ma part ça n’est pas si simple…du tout !
J’utilise les flows Directus pour tout un tas d’actions y compris l’envoi de notifications push à mes utilisateurs.
Avec l’API FCM cela fonctionne à merveille :
J’utilise un Webhook/Request URL et je crée un POST avec l’URL https://fcm.googleapis.com/fcm/send (fournie par google), puis dans Headers « Authorization Valeur: key=<Clé serveur récupérée auparavant> »

Mais voila que des juin tout cela ne fonctionnera plus et la documentation nous dit qu’il faudra dorénavant avoir accès à :

  • 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

Et c’est la que je bloque: comment avoir accès à ces informations sans travailler avec l’un de leur service (Compute Engine, Google Kubernetes Engine, App Engine ou Cloud Functions) ?
Vais-je devoir être obligé de changer complètement ma façon de faire, tout faire dans mon app et ne plus passer par flow pour envoyer mes notifications ?

Est-ce que quelqu’un a fait cette migration ?

Merci d’avance pour votre aide.

Fabio

Bonsoir @fabio.buona,

Je suis en train de développer une app, et je vais bientôt (début janvier) avoir besoin d’intégrer des notifications push. Je commence donc à me pencher sur le sujet.
Je suis tombé sur un tuto Youtube concernant la mise en place de l’API HTTP v1.
Je te poste le lien au cas ou tu ne l’aurais pas visionné: https://www.youtube.com/watch?v=oNoRw69ro2k

Bonne chance dans tes recherches.

Benoît

1 « J'aime »

Salut,
Merci pour ton retour. Je vais regarder cette vidéo et combiner cela avec une piste que je suis actuellement :slight_smile:
Je te ferais un retour!

Bon travail à toi.

Fabio

1 « J'aime »

Je te remercie @Behache pour le lien de la vidéo qui m’a apporté les 2-3 dernières réponses qui m’ont permis de réussir ma migration des anciennes API FCM vers HTTP V1.

Je vais tenter de vous expliquer cela ici.

Je trouve que la doc google n’est pas suffisamment claire et qu’il manque des informations clefs pour réussir cette migration.
Comme la doc l’indique à cette adresse Migrer des anciennes API FCM vers HTTP v1 le nouveau format d’un envoi d’une notification push est le suivant :

  • POST https://fcm.googleapis.com/v1/projects/ myProjectId /messages:send

  • Authorization: Bearer accessToken

  • {
    « message »:{
    « token »: « token of the receiver device »,
    « notification »:{
    « body »: « This is an FCM notification message! »,
    « title » : « FCM Message »
    },
    « data »:{
    « data1 »: « data1 »,
    « data2 »: « data2 »
    }}}

Je vais vous expliquer comment trouver myProjectId et comment générer dans notre code Flutter l’ accessToken:

Après avoir ajouter Firebase à notre application, on doit créer un fichier JSON pour nos demandes d’accessToken.

On se rend sur Google cloud console puis :

  1. On sélectionne notre projet

  2. En haut à gauche on clique sur paramètres du projet

  3. Sur la page Paramètres généraux on prend notre de notre ID du projet qui correspond à myProjectId…première réponse donnée :slight_smile:

  4. Tout en haut on clique sur Cloud messaging

  5. On vérifie que API Firebase Cloud Messaging (V1) soit bien activée

  6. Normalement un compte de service devrait s’être automatiquement crée auparavant en ajoutant Firebase à notre projet

  7. On clique sur gérer les Comptes de services

  8. On clique sur le compte de service existant

  9. On vérifie que l’état du compte de service est bien activé, sinon on l’active

  10. Tout en haut on clique sur Clés

  11. Ajouter une clef

  12. Créer une clef

  13. Au format JSON

  14. On télécharge le fichier JSON et on le met dans un dossier accessible par notre application (Attention il ne sera pas possible de télécharger ce fichier une seconde fois ! )

  15. A partir de la on va être capable de générer un accessToken dans notre code avec la fonction suivante :

pubspec.yaml
dependecies:
googleapis_auth: ^1.4.1

import ‹ package:flutter/services.dart ›;
import ‹ package:googleapis_auth/auth_io.dart ›;
import ‹ dart:convert ›;

Future generateAccessToken() async {

final serviceAccountPath = 'path to your JSON file';

final content = await rootBundle.loadString(serviceAccountPath);

final credentials = ServiceAccountCredentials.fromJson(jsonDecode(content));

final accessScopes = ["https://www.googleapis.com/auth/firebase.messaging"];

final client = await clientViaServiceAccount(credentials, accessScopes);

final accessToken = client.credentials.accessToken.data;

return accessToken;

}

Et c’est donc ce fameux accessToken que l’on va utiliser pour pour nos envois de notifications push avec la nouvelle version FCM HTTP V1.
Il faut penser à renouveler cet accessToken avant chaque utilisation car sa validité dans le temps est faible.

Personnellement j’utilise Flows dans Directus pour envoyer mes notifications push et cela fonctionne parfaitement.

J’espère que mon explication est claire, si ça n’est pas le cas je suis dispo pour plus d’infos, avec plaisir.

En attendant je vous souhaite de bonnes fêtes de fin d’année à tous !

Fabio

4 « J'aime »

Bonjour @fabio.buona,

Merci pour toutes ces précisions. Je viens de commencer à implémenter les notifications push à mon application et j’ai suivi tes conseils avec attention.
J’utilise également un service Directus et j’aimerais m’en servir pour envoyer les notifications. Pourrais-tu m’en dire un peu plus sur la marche à suivre et notamment sur l’utilisation de Flows. Comment organises-tu cela depuis Flows ? Est-ce que tu crées une collection « Notification » depuis laquelle tu récupères des infos pour les envoyer à Firebase ?

Au plaisir de te lire,

Benoit

Salut,

Désolé pour ma réponse très tardive.
C’est avec plaisir, si je peux enfin aider quelqu’un à mon tour !

As-tu déjà pris un peu la main sur flows ?
Veux-tu que je te montre un exemple de Webhook / Requests URL pour l’envoie d’une notification ?

Personnellement je n’ai pas crée de collection spécifique aux notifications push non. Je crée un flow pour chaque type de notification que je souhaite envoyer. Par exemple:
1 flow pour notifier les users lors de l’ajout d’une nouvelle info dans mon appli.
1 autre flow pour les notifier lors de la modification de certaines données
1 autre …
Dans chacun de mes flows, je vais utiliser un et souvent plusieurs Read Data pour aller chercher dans chacune de mes collections les informations nécessaires.

Grace à flows, dans Directus, tu peux déclencher des envois à des heures précises, chaque jours par exemple ou alors les déclencher lorsqu’il se passe quelque chose de précis dans tes collections (create, update, delete,…).

Dis moi si mes explications t’éclaircissent un peu les idées et de quelles genres de précisions tu souhaiterais.
J’ai pris pas mal de notes sur Evernote, que je pourrais te partager pour t’aider.

J’espère pouvoir t’aider.

Bonne soirée.

Fabio

Salut @fabio.buona,

Merci pour ton retour.
Ce que je souhaiterais, c’est créer une collection « Notification » dans laquelle j’aurais plusieurs champs comme « title », « body », etc… Dès que je crée une « notification » (donc Create) cela enverrait les infos nécessaire à Firebase Cloud Messaging qui pourrait alors distribuer ma notification push.

Pour le coup, je suis très intéressé pour voir comment tu organises Flows et voir un exemple de Webhook / Requests Url pour envoyer les infos à FCM.

Merci pour ton aide. Au plaisir de te lire.

Benoit

Hello,
Donc pour envoyer une notification push depuis un flow Directus tu vas devoir créer un Webhook / Request URL.
Ensuite tu le remplis de la manière suivante :

Method POST
URL https://fcm.googleapis.com/v1/projects/ TonIdProjet /messages:send
(TonIdProjet tu le trouves dans ta console Firebase, sous paramètres du projet : ID du projet)
Header Header: Authorization Value: Bearer AccessToken
Request Body

{
   "message":{
      "token":"fcmTokenDeviceDeReception",
      "notification":{
        "body":"This is my push notification",
        "title":"This is my notification's title"
      }
   }
}

Et donc dans mon cas ce que je fais c’est qu’avant cette action je fais des readData dans mes autres tables pour aller chercher AccessToken, pour aller chercher le fcmToken de la personne que je souhaite viser, son nom pour le noter dans le body,… toutes les infos que je veux faire apparaitre ou mentionner dans ma notification.

J’espère que cela va t’aider :slight_smile:

Bon aprem.

Fabio

Merci @fabio.buona,

C’est tout parfait pour moi :star_struck:. Avec l’ensemble de tes retours et explications, j’ai assez facilement réussi a envoyer des notifications push depuis Directus.
Merci pour le partage :pray:

Bonne continuation,

Benoit

1 « J'aime »

Bonjour à tous,

J’ai vu cette vidéo également qui pourrait aider concernant l’accessToken:

J’ai presque terminé de mettre en place l’envoi des notifications et je me pose une question:
Dans le code source de mon application Flutter, j’ai à la fois la partie téléphone mobile (client) et la partie web (administration).
Dans mon application, je vais donc avoir le fichier JSON qui va me permettre de générer un accessToken quand j’en aurai besoin.

Quid de la sécurité une fois que mon application est compilée et publiée sur les stores?

Bonjour,
As tu trouvé une solution équivalente pour générer l’accessToken avec le json sous SwiftUI? Ou tu n’utilise que Flutter?
Parce que c’est mit en place sur la version Flutter mais pour IOS je coince :disappointed:

Salut,
Non désolé, je n’utilise que Flutter !