Gérer les sessions avec Firestore


De nombreuses applications requièrent une fonctionnalité de gestion de session pour l'authentification et le stockage des préférences utilisateur. Le framework Node.js Express intègre une mise en œuvre basée sur la mémoire pour assurer cette gestion. Cette mise en œuvre n'est toutefois pas adaptée à une application pouvant être diffusée depuis plusieurs instances. En effet, la session enregistrée dans une instance peut différer des autres instances. Ce tutoriel explique comment gérer des sessions sur App Engine.

Objectifs

  • Écrire l'application
  • Exécuter l'application en local
  • Déployer l'application sur App Engine

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Une fois que vous avez terminé les tâches décrites dans ce document, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Pour en savoir plus, consultez la section Effectuer un nettoyage.

Avant de commencer

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Firestore API.

    Enable the API

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Firestore API.

    Enable the API

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init

Mettre en place le projet

  1. Dans votre fenêtre de terminal, accédez au répertoire de votre choix et créez-y un répertoire nommé sessions. L'ensemble du code de ce tutoriel se base sur une exécution dans le répertoire sessions.

  2. Accédez donc à ce répertoire sessions :

    cd sessions
    
  3. Initialisez le fichier package.json :

    npm init .
    
  4. Installez les dépendances :

    npm install \
     --save @google-cloud/connect-firestore @google-cloud/firestore express express-session
    

À la fin de ce tutoriel, la structure de fichiers finale ressemble à ce qui suit :

sessions
├── app.yaml
├── index.js
└── package.json

Écrire l'application Web

L'application affiche des messages d'accueil dans différentes langues pour chaque utilisateur. Les utilisateurs connus reçoivent toujours les messages d'accueil dans la même langue.

Fenêtres d'application affichant un message d'accueil dans différentes langues.

Pour que votre application puisse stocker les préférences d'un utilisateur, vous devez mettre en œuvre une méthode permettant de stocker les informations sur l'utilisateur actuel dans une session. Dans cet exemple d'application, les données de session sont stockées à l'aide de Firestore.

Vous pouvez utiliser connect-firestore, un magasin de sessions compatible avec express-session.

  • Dans votre fenêtre de terminal, créez un fichier nommé index.js contenant le code suivant :

    // Copyright 2019, Google LLC.
    // Licensed under the Apache License, Version 2.0 (the "License");
    // you may not use this file except in compliance with the License.
    // You may obtain a copy of the License at
    //
    //    http://www.apache.org/licenses/LICENSE-2.0
    //
    // Unless required by applicable law or agreed to in writing, software
    // distributed under the License is distributed on an "AS IS" BASIS,
    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    // See the License for the specific language governing permissions and
    // limitations under the License.
    
    const {Firestore} = require('@google-cloud/firestore');
    const express = require('express');
    const session = require('express-session');
    
    const app = express();
    const {FirestoreStore} = require('@google-cloud/connect-firestore');
    
    app.use(
      session({
        store: new FirestoreStore({
          dataset: new Firestore(),
          kind: 'express-sessions',
        }),
        secret: 'my-secret',
        resave: false,
        saveUninitialized: true,
      })
    );
    
    const greetings = [
      'Hello World',
      'Hallo Welt',
      'Ciao Mondo',
      'Salut le Monde',
      'Hola Mundo',
    ];
    
    app.get('/', (req, res) => {
      if (!req.session.views) {
        req.session.views = 0;
        req.session.greeting =
          greetings[Math.floor(Math.random() * greetings.length)];
      }
      const views = req.session.views++;
      res.send(`${views} views for ${req.session.greeting}`);
    });
    
    const port = process.env.PORT || 8080;
    app.listen(port, () => {
      console.log(`Example app listening on port ${port}!`);
    });
    
    module.exports = app;
    

Le schéma suivant décrit la façon dont Firestore gère les sessions pour l'application App Engine.

Schéma de principe : utilisateur, App Engine, Firestore.

Une fois que vous avez défini app.use(session), chaque requête est associée à une propriété req.session permettant d'identifier les utilisateurs récurrents. Les données de session sont stockées dans Firestore.

Supprimer des sessions

Connect-firestore ne supprime pas les sessions anciennes ou expirées. Vous pouvez supprimer les données de session dans la console Google Cloud ou mettre en œuvre une stratégie de suppression automatique. Si vous utilisez des solutions de stockage pour des sessions telles que Memcache ou Redis, les sessions expirées sont automatiquement supprimées.

Exécuter l'application en local

  1. Dans la fenêtre de terminal, installez les dépendances pour le projet Google Cloud :

    npm install
    
  2. Démarrez le serveur HTTP :

    npm start
    
  3. Affichez l'application dans votre navigateur Web :

    Cloud Shell

    Dans la barre d'outils Cloud Shell, cliquez sur Aperçu sur le Web Aperçu sur le Web et sélectionnez Prévisualiser sur le port 8080.

    Machine locale

    Dans votre navigateur, accédez à http://localhost:8080

    L'un des cinq messages d'accueil suivants s'affiche : "Hello World", "Hallo Welt", "Hola mundo", "Salut le Monde" ou "Ciao Mondo". La langue change si vous ouvrez la page dans un autre navigateur ou en mode navigation privée. Vous pouvez consulter et modifier les données de session dans la console Google Cloud.

    Sessions Firestore dans la console Google Cloud.

  4. Dans votre fenêtre de terminal, appuyez sur Control+C pour arrêter le serveur HTTP.

Déployer et exécuter l'application sur App Engine

Vous pouvez utiliser l'environnement standard App Engine pour créer et déployer une application qui s'exécute de manière fiable, même lorsqu'elle est soumise à une charge importante et doit gérer de grandes quantités de données.

Dans ce tutoriel, le serveur est déployé dans l'environnement standard App Engine.

  1. Dans votre fenêtre de terminal, créez un fichier app.yaml et copiez le contenu suivant :

    runtime: nodejs10
  2. Déployez l'application sur App Engine :

    gcloud app deploy
    
  3. Affichez l'application en direct en saisissant l'URL suivante :

    https://PROJECT_ID.REGION_ID.r.appspot.com

    Remplacez les éléments suivants :

Le message d'accueil est désormais diffusé par un serveur Web exécuté sur une instance App Engine.

Déboguer l'application

Si vous ne parvenez pas à vous connecter à votre application App Engine, vérifiez les éléments suivants :

  1. Vérifiez que les commandes de déploiement gcloud ont bien abouti et n'ont généré aucune erreur. Si des erreurs se sont produites (par exemple, message=Build failed), corrigez-les, puis essayez de redéployer l'application App Engine.
  2. Dans Google Cloud Console, accédez à la page Explorateur de journaux.

    Accéder à la page Explorateur de journaux

    1. Dans la liste déroulante Ressources sélectionnées récemment, cliquez sur Application App Engine, puis sur Tous les ID de module. La liste des requêtes correspondant à votre accès à l'application s'affiche. Si cette liste n'apparaît pas, vérifiez que vous avez bien sélectionné Tous les ID de module dans la liste déroulante. Si des messages d'erreur s'affichent dans la console Google Cloud, vérifiez que le code de votre application correspond au code décrit dans la section sur l'écriture de l'application Web.

    2. Assurez-vous que l'API Firestore est activée.

Effectuer un nettoyage

Supprimer le projet

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Supprimer l'instance App Engine

  1. In the Google Cloud console, go to the Versions page for App Engine.

    Go to Versions

  2. Select the checkbox for the non-default app version that you want to delete.
  3. Pour supprimer la version de l'application, cliquez sur  Supprimer.

Étapes suivantes