Gestione delle sessioni con Firestore

Molte app richiedono la gestione delle sessioni per l'autenticazione e le preferenze dell'utente. Sinatra viene fornita con un'implementazione basata sulla memoria per eseguire questa funzione. Tuttavia, questa implementazione non è adatta per un'app che può essere pubblicata da più istanze, perché la sessione registrata su un'istanza potrebbe differire da altre. Questo tutorial mostra come gestire le sessioni su App Engine.

Obiettivi

  • Scrivi l'app.
  • Esegui l'app localmente.
  • Eseguire il deployment dell'app su App Engine.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud possono essere idonei a una prova senza costi aggiuntivi.

Una volta completate le attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la pagina Pulizia.

Prima di iniziare

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. Attiva l'API Firestore.

    Abilita l'API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  7. Attiva l'API Firestore.

    Abilita l'API

  8. Prepara l'ambiente di sviluppo.

Configurazione del progetto

  1. Nella finestra del terminale, inizia da una directory di tua scelta e crea una nuova directory denominata sessions. Tutto il codice di questo tutorial si trova all'interno della directory sessions.

  2. Passa alla directory sessions:

    cd sessions
    
  3. Inizializza Gemfile:

    bundle init
    
  4. Aggiungi quanto segue al Gemfile risultante:

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

    Gemfile elenca tutte le librerie Ruby non standard che l'app deve caricare per App Engine:

    • google-cloud-firestore è il client Ruby per l'API Firestore.

    • Sinatra è il framework web Ruby utilizzato per l'app.

  5. Installa le dipendenze:

    bundle install
    

Scrivere l'app web

Questa app visualizza gli annunci in lingue diverse per ogni utente. Gli utenti di ritorno vengono sempre accolti nella stessa lingua.

  • Con un editor di testo, crea un file denominato app.rb nella directory sessions con i seguenti contenuti:

    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

Creazione dello store di sessioni in corso...

Prima che l'app possa memorizzare le preferenze per un utente, devi avere un modo per memorizzare le informazioni relative all'utente corrente in una sessione. Il seguente diagramma illustra la modalità in cui Firestore gestisce le sessioni per l'app App Engine.

Diagramma dell'architettura: utente, App Engine, Firestore.

Sinatra offre il supporto integrato per il salvataggio dei dati delle sessioni in un cookie. Per salvare il file in Firestore, devi definire il tuo oggetto Rack::Session.

  • Nella directory sessions, crea un file denominato firestore_session.rb con il seguente contenuto:

    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

Eliminare le sessioni

Come indicato, questa app non elimina le sessioni vecchie o scadute. Puoi eliminare i dati della sessione in Google Cloud Console o implementare una strategia di eliminazione automatica.

Esecuzione locale

  1. Avvia il server HTTP:

    bundle exec ruby app.rb
    
  2. Visualizza l'app nel browser web.

    Vedi uno dei cinque saluti: "Hello World", "&allot di Welt",, "Hola mundo", "Salut le Monde", o "Ciao Mondo". La lingua cambia se apri la pagina in un altro browser o in modalità di navigazione in incognito. Puoi visualizzare e modificare i dati delle sessioni nella Google Cloud Console.

  3. Per arrestare il server HTTP, premi Control+C nella finestra del terminale.

Deployment ed esecuzione su App Engine

Puoi utilizzare l'ambiente standard di App Engine per creare un'app, eseguirne il deployment in modo affidabile e con un carico elevato e con grandi quantità di dati.

Questo tutorial utilizza l'ambiente standard di App Engine per il deployment del server.

  1. Nella finestra del terminale, crea un file app.yaml e incolla quanto segue nel file:

    runtime: ruby25
    entrypoint: bundle exec ruby app.rb
  2. Esegui il deployment dell'app su App Engine:

    gcloud app deploy
    
  3. Visualizza l'app attiva al seguente URL, dove PROJECT_ID è il tuo ID progetto Google Cloud:

    https://PROJECT_ID.appspot.com

Il saluto è ora eseguito da un server web in esecuzione su un'istanza di App Engine.

Eseguire il debug dell'app

Se non riesci a connetterti all'app App Engine, verifica quanto segue:

  1. Verifica che i comandi di deployment di gcloud siano stati completati correttamente e che non abbiano restituito errori. In caso di errori (ad esempio, message=Build failed), correggili e riprova a eseguire il deployment dell'app App Engine.
  2. In Google Cloud Console, vai alla pagina Esplora log.

    Vai alla pagina Esplora log

    1. Nell'elenco a discesa Risorse selezionate di recente, fai clic su Applicazione App Engine e poi su Tutti i moduli_id. Viene visualizzato un elenco di richieste ricevute quando hai visitato la tua app. Se non viene visualizzato un elenco di richieste, verifica di avere selezionato Tutti il modulo_ID dall'elenco a discesa. Se vengono visualizzati messaggi di errore stampati nella console Google Cloud, verifica che il codice dell'app corrisponda al codice nella sezione relativa alla scrittura dell'app web.

    2. Assicurati che l'API Firestore sia abilitata.

Esegui la pulizia

Elimina il progetto

  1. Nella console Google Cloud, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.

Elimina l'istanza di App Engine

  1. Nella console Google Cloud, vai alla pagina Versioni di App Engine.

    Vai a Versioni

  2. Seleziona la casella di controllo relativa alla versione non predefinita dell'app che vuoi eliminare.
  3. Per eliminare la versione dell'app, fai clic su Elimina.

Passaggi successivi