Como gerenciar sessões com o Firestore


Muitos aplicativos precisam gerenciar sessões de autenticação e preferências do usuário. A biblioteca Node.js Express vem com uma implementação baseada em memória para executar essa função. No entanto, essa implementação não é adequada para um aplicativo que pode ser veiculado de várias instâncias, porque a sessão gravada em uma instância pode ser diferente nas outras. Veja neste tutorial como gerenciar sessões no App Engine.

Objetivos

  • Gravar o aplicativo.
  • Executar o aplicativo localmente.
  • Implantar o aplicativo no App Engine.

Custos

Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Saiba mais em Limpeza.

Antes de começar

  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

Como configurar o projeto

  1. Na janela de terminal, inicie em um diretório de sua escolha e crie um novo diretório chamado sessions. Todo o código deste tutorial está dentro do diretório sessions.

  2. Mude para o diretório sessions:

    cd sessions
    
  3. Inicialize o arquivo package.json:

    npm init .
    
  4. Instale as dependências:

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

No final deste tutorial, a estrutura final do arquivo é semelhante à seguinte:

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

Como gravar o app da Web

Esse aplicativo exibe saudações em idiomas diferentes para cada usuário. Os usuários retornantes são sempre recebidos no mesmo idioma.

Várias janelas de aplicativos exibindo uma saudação em idiomas diferentes.

Para que o app possa armazenar as preferências de um usuário, você precisa de uma maneira de armazenar informações sobre o usuário atual em uma sessão. Este aplicativo de amostra usa o Firestore para armazenar dados da sessão.

Você pode usar connect-firestore, um armazenamento de sessões compatível com express-session.

  • Na janela de terminal, crie um arquivo chamado index.js com o seguinte conteúdo:

    // 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;
    

Veja no diagrama a seguir como o Firestore gerencia as sessões do aplicativo do App Engine.

Diagrama da arquitetura: usuário, App Engine, Firestore.

Depois de configurar app.use(session), todas as solicitações têm uma propriedade req.session que você pode usar para identificar usuários recorrentes. Os dados da sessão são armazenados no Firestore.

Como excluir sessões

Connect-firestore não exclui sessões antigas ou expiradas. É possível excluir dados da sessão no Console do Google Cloud ou implementar uma estratégia de exclusão automática. Se você usar soluções de armazenamento para sessões como Memcache ou Redis, as sessões expiradas serão excluídas automaticamente.

Como executar no local

  1. Na janela do terminal, instale as dependências do projeto do Google Cloud:

    npm install
    
  2. Inicie o servidor HTTP:

    npm start
    
  3. Veja seu app no navegador da Web:

    Cloud Shell

    Na barra de ferramentas do Cloud Shell, clique em Visualização da Web Visualização da Web e selecione Visualizar na porta 8080.

    Máquina local

    No navegador, acesse http://localhost:8080

    Você verá uma das cinco saudações: "Hello World"," "Hallo Welt", "Hola mundo", "Salut le Monde" ou "Ciao Mondo". O idioma será alterado se você abrir a página em um navegador diferente ou no modo de navegação anônima. É possível ver e editar os dados da sessão no Console do Google Cloud.

    Sessões do Firestore no Console do Google Cloud.

  4. Para interromper o servidor HTTP, pressione Control+C na janela do terminal.

Como implantar e executar no App Engine

Use o ambiente padrão do App Engine para criar e implantar um aplicativo que seja executado de forma confiável sob carga pesada e com grandes quantidades de dados.

Neste tutorial, o ambiente padrão do App Engine é usado para implantar o servidor.

  1. Na janela de terminal, crie um arquivo app.yaml e copie o seguinte:

    runtime: nodejs10
  2. Implante o aplicativo no App Engine:

    gcloud app deploy
    
  3. Veja o aplicativo ativo inserindo o seguinte URL:

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

    Substitua:

A saudação agora é entregue por um servidor da Web em execução em uma instância do App Engine.

Como depurar o aplicativo

Se você não conseguir se conectar ao aplicativo do App Engine, verifique o seguinte:

  1. Verifique se os comandos de implantação gcloud foram concluídos com êxito e não geraram erros. Se houver erros (por exemplo, message=Build failed), corrija-os e tente implantar o aplicativo do App Engine novamente.
  2. No console do Google Cloud, acesse a página do Explorador de registros.

    Acessar a página Explorador de registros

    1. Na lista suspensa Recursos selecionados recentemente, clique em Aplicativo App Engine e, em seguida, clique em Todos os module_id. Você verá uma lista de solicitações de quando visitou seu aplicativo. Caso contrário, verifique se você selecionou Todos os module_id na lista suspensa. Se você vir mensagens de erro impressas no console do Google Cloud, verifique se o código do seu aplicativo corresponde ao código na seção sobre como criar o app da Web.

    2. Verifique se a API Firestore está ativada.

Limpar

Excluir o projeto

  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.

Excluir a instância do 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. Para excluir a versão do app, clique em Excluir.

A seguir