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. Sinatra 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. Connectez-vous à votre compte Google Cloud. Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits gratuits pour exécuter, tester et déployer des charges de travail.
  2. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  3. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  4. Activez l'API Firestore

    Activer l'API

  5. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  6. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  7. Activez l'API Firestore

    Activer l'API

  8. Préparez votre environnement de développement.

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

    bundle init
    
  4. Ajoutez les éléments suivants au fichier Gemfile résultant :

    gem "google-cloud-firestore", "~> 2.0"
    gem "sinatra", "~> 2.0"

    Le fichier Gemfile répertorie toutes les bibliothèques Ruby non standards qu'App Engine doit charger pour votre application :

    • google-cloud-firestore est le client Ruby pour l'API Firestore.

    • Sinatra est le framework Web Ruby utilisé pour l'application.

  5. Installez les dépendances :

    bundle install
    

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

  • À l'aide d'un éditeur de texte, créez dans le répertoire sessions un fichier nommé app.rb et possédant le contenu suivant :

    require "sinatra"
    
    require_relative "firestore_session"
    
    use Rack::Session::FirestoreSession
    
    set :greetings, ["Hello World", "Hallo Welt", "Ciao Mondo", "Salut le Monde", "Hola Mundo"]
    
    get "/" do
      session[:greeting] ||= settings.greetings.sample
      session[:views] ||= 0
      session[:views] += 1
      "<h1>#{session[:views]} views for \"#{session[:greeting]}\"</h1>"
    end

Créer le magasin de sessions

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

Sinatra est nativement compatible avec l'enregistrement des données de session dans un cookie. Pour enregistrer des données dans Firestore, vous devez définir votre propre objet Rack::Session.

  • Dans le répertoire sessions, créez un fichier nommé firestore_session.rb et possédant le contenu suivant :

    require "google/cloud/firestore"
    require "rack/session/abstract/id"
    
    module Rack
      module Session
        class FirestoreSession < Abstract::Persisted
          def initialize app, options = {}
            super
    
            @firestore = Google::Cloud::Firestore.new
            @col = @firestore.col "sessions"
          end
    
          def find_session _req, session_id
            return [generate_sid, {}] if session_id.nil?
    
            doc = @col.doc session_id
            fields = doc.get.fields || {}
            [session_id, stringify_keys(fields)]
          end
    
          def write_session _req, session_id, new_session, _opts
            doc = @col.doc session_id
            doc.set new_session, merge: true
            session_id
          end
    
          def delete_session _req, session_id, _opts
            doc = @col.doc session_id
            doc.delete
            generate_sid
          end
    
          def stringify_keys hash
            new_hash = {}
            hash.each do |k, v|
              new_hash[k.to_s] =
                if v.is_a? Hash
                  stringify_keys v
                else
                  v
                end
            end
            new_hash
          end
        end
      end
    end

Supprimer des sessions

Telle qu'elle est écrite, cette application ne supprime pas les sessions anciennes ou ayant expiré. Vous pouvez supprimer les données de session dans Google Cloud Console ou implémenter une stratégie de suppression automatique.

Exécuter l'application en local

  1. Démarrez le serveur HTTP :

    bundle exec ruby app.rb
    
  2. Affichez l'application dans votre navigateur Web.

    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 Google Cloud Console.

  3. 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 collez-y le contenu suivant :

    runtime: ruby25
    entrypoint: bundle exec ruby app.rb
  2. Déployez l'application sur App Engine :

    gcloud app deploy
    
  3. Affichez l'application active à l'URL suivante, où PROJECT_ID correspond à l'ID de votre projet Google Cloud :

    https://PROJECT_ID.appspot.com

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 Google Cloud Console, 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. Dans la console Google Cloud, accédez à la page Gérer les ressources.

    Accéder à la page Gérer les ressources

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

Supprimer l'instance App Engine

  1. Dans la console Google Cloud, accédez à la page Versions pour App Engine.

    Accéder à la page "Versions"

  2. Cochez la case correspondant à la version de l'application autre que celle par défaut que vous souhaitez supprimer.
  3. Pour supprimer la version de l'application, cliquez sur  Supprimer.

Étapes suivantes