Como gerenciar sessões com o Firestore


Muitos aplicativos precisam de gerenciamento de sessões para autenticação e preferências do usuário. O ASP.NET Core vem com middleware para armazenar sessões em um cache distribuído.

O cache distribuído padrão do ASP.NET não é realmente distribuído. Ele armazena os dados da sessão na memória do servidor da Web. Quando apenas um servidor da Web está exibindo um site, essa estratégia é adequada. Mas quando muitos servidores da Web estão exibindo um site, os usuários do site podem experimentar erros e perda de dados.

Para evitar erros e perda de dados, um aplicativo ASP.NET precisa usar um cache distribuído que armazena dados em um armazenamento de dados persistente. Este tutorial mostra como gerenciar sessões no Cloud Run armazenando-as no Firestore e criptografando cookies com o Cloud Key Management Service.

Objetivos

  • Implantar o aplicativo no Cloud Run.

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. Faça login na sua conta do Google Cloud. Se você começou a usar o Google Cloud agora, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
  2. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  3. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  4. Ative as APIs Firestore, Cloud Run, Cloud Key Management Service, and Cloud Storage.

    Ative as APIs

  5. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  6. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  7. Ative as APIs Firestore, Cloud Run, Cloud Key Management Service, and Cloud Storage.

    Ative as APIs

  8. Para criar um banco de dados do Firestore no modo nativo, conclua as seguintes etapas:
    1. No console do Google Cloud, acesse a página Visualizador do Firestore.
      Acessar o visualizador do Firestore
    2. Na tela Selecione um modo do Firestore, clique em Selecione o modo nativo.
    3. Selecione um local para seu banco de dados do Firestore. Essa configuração refere-se ao local padrão de recurso do Google Cloud para seu projeto do Google Cloud. Ele é usado pelos serviços do seu projeto do Google Cloud que exigem uma configuração de local, especificamente, o bucket padrão do Cloud Storage e o app App Engine.
    4. Clique em Criar banco de dados.
  9. No Cloud Shell, abra o código-fonte do app.
    Acessar o Cloud Shell

    O Cloud Shell oferece acesso de linha de comando aos seus recursos do Google Cloud diretamente no navegador.

  10. Para fazer o download do código de exemplo e passar para o diretório do app, clique em Continuar.
  11. No Cloud Shell, configure a CLI gcloud para usar o novo projeto do Google Cloud:

    # Configure gcloud for your project
    gcloud config set project PROJECT_ID
    

    Substitua PROJECT_ID pelo ID do projeto do Google Cloud que você criou usando o console do Google Cloud.

    A Google Cloud CLI é a principal maneira de interagir com os recursos do Google Cloud na linha de comando. Neste tutorial, você usará a CLI gcloud para implantar e monitorar seu app.

Examinar o código-fonte

O diagrama a seguir ilustra como o Firestore gerencia sessões para o aplicativo Cloud Run.

Diagrama da arquitetura: usuário, Cloud Run, Firestore.

O método ConfigureServices no arquivo Startup.cs configura o aplicativo para usar o Cloud KMS para criptografia e o Cloud Storage para armazenar chaves criptografadas.

  1. No Cloud Shell, clique em lançar editor para iniciar o editor e examinar o arquivo Startup.cs.

    public void ConfigureServices(IServiceCollection services)
    {
        // Antiforgery tokens require data protection.
        services.AddDataProtection()
            // Store keys in Cloud Storage so that multiple instances
            // of the web application see the same keys.
            .PersistKeysToGoogleCloudStorage(
                Configuration["DataProtection:Bucket"],
                Configuration["DataProtection:Object"])
            // Protect the keys with Google KMS for encryption and fine-
            // grained access control.
            .ProtectKeysWithGoogleKms(
                Configuration["DataProtection:KmsKeyName"]);
        services.AddFirestoreDistributedCache(
                Configuration["FIRESTORE_PROJECT_ID"])
            .AddFirestoreDistributedCacheGarbageCollector();
        services.AddSession();
    }
    

Como configurar o projeto do Google Cloud

  1. No editor do Cloud Shell, edite o arquivo appsettings.json e substitua as duas instâncias de YOUR-PROJECT-ID pelo ID do projeto do Google Cloud. Salve o arquivo.

    {
      "Logging": {
        "LogLevel": {
          "Default": "Warning"
        }
      },
      "AllowedHosts": "*",
      "DataProtection": {
        "Bucket": "YOUR-PROJECT-ID-bucket",
        "Object": "DataProtectionProviderKeys.xml",
        "KmsKeyName": "projects/YOUR-PROJECT-ID/locations/global/keyRings/dataprotectionprovider/cryptoKeys/masterkey"
      }
    }
    
  2. Crie um novo keyring do Cloud Key Management Service chamado dataprotectionprovider:

    gcloud kms keyrings create dataprotectionprovider --location global

  3. Crie uma nova chave do Cloud Key Management Service chamada masterkey:

    gcloud kms keys create masterkey --location global --keyring dataprotectionprovider --purpose=encryption

  4. Crie um bucket do Cloud Storage para armazenar as chaves criptografadas:

    gsutil mb gs://PROJECT_ID-bucket

Como implantar e executar no Cloud Run

Você pode usar o Cloud Run para criar e implantar um aplicativo que seja executado de maneira confiável sob carga pesada e com grandes quantidades de dados.

Neste tutorial, o Cloud Run é usado para implantar o servidor.

  1. No Cloud Shell, publique o aplicativo:

    dotnet publish -c Release
    
  2. Use o Cloud Build para criar um contêiner do Docker e publicar no Container Registry:

    gcloud builds submit --tag gcr.io/PROJECT_ID/sessions bin/Release/netcoreapp2.1/publish

  3. Execute o contêiner com o Cloud Run:

    gcloud beta run deploy sessions --region us-central1 --platform managed --image gcr.io/PROJECT_ID/sessions --allow-unauthenticated

    Anote o URL na saída:

    Service [sessions] revision [sessions-00003-xiz] has been deployed and is serving
    100 percent of traffic at https://sessions-r3f3em7nuq-uc.a.run.app
  4. Para visualizar o aplicativo ao vivo, acesse o URL que você copiou da etapa anterior.

Como excluir sessões

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

Como depurar o aplicativo

Se você não conseguir se conectar ao seu aplicativo Cloud Run, 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 Cloud Run novamente.
  2. Consulte o guia do Cloud Run para ver registros.

Limpeza

Excluir o projeto

  1. No Console do Google Cloud, acesse a página Gerenciar recursos.

    Acessar "Gerenciar recursos"

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

A seguir