Neste tutorial, mostramos como recuperar, verificar e armazenar credenciais de usuário usando o Firebase Authentication, o ambiente padrão do App Engine e o Datastore.
Neste documento, você conhecerá um aplicativo simples de anotações, o Firenotes, que armazena as anotações dos usuários nos respectivos notebooks. Os notebooks são armazenados por usuário e identificados pelo ID exclusivo do Firebase Authentication de cada usuário. O aplicativo tem os seguintes componentes:
O front-end configura a interface do usuário de login e recupera o ID do Firebase Authentication. Ele também processa alterações de estado de autenticação e permite que os usuários vejam as próprias anotações.
A FirebaseUI é uma solução de código aberto que simplifica as tarefas de autenticação e IU. O SDK lida com o login do usuário, vinculando vários provedores a uma conta, recuperando senhas e muito mais. Ele implementa as práticas recomendadas de autenticação para fornecer uma experiência de login tranquila e segura.
O back-end verifica o estado de autenticação do usuário e retorna as informações de perfil dele, bem como as respectivas anotações.
O aplicativo armazena credenciais de usuário no Datastore usando a biblioteca de cliente NDB, mas é possível armazenar as credenciais em um banco de dados de sua escolha.
O diagrama a seguir mostra como o front-end e o back-end se comunicam entre si e como as credenciais de usuário passam do Firebase para o banco de dados.O Firenotes é baseado no framework de aplicativos da Web Flask. No aplicativo de exemplo, optamos pela Flask devido à simplicidade e à facilidade de uso, mas as tecnologias e os conceitos explorados são aplicáveis independentemente da biblioteca usada.
Objetivos
Após completar este tutorial, você saberá como:
- configurar a interface do usuário do Firebase Authentication;
- receber um token de ID do Firebase e verificá-lo usando a autenticação do lado do servidor;
- armazenar credenciais de usuário e dados associados no Datastore;
- consultar um banco de dados usando a biblioteca de cliente NDB;
- implantar um aplicativo no App Engine.
Custos
Neste tutorial, há componentes faturáveis do Google Cloud, entre eles:
- Datastore
Use a calculadora de preços para gerar uma estimativa de custo com base no uso previsto.
Antes de começar
- Instale Git, Python 2.7 (ambos em inglês) e virtualenv. Para mais informações sobre como configurar o ambiente de desenvolvimento do Python, como instalar a versão mais recente, consulte Como configurar um ambiente de desenvolvimento do Python para o Google Cloud.
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
Se você já tiver instalado e inicializado o SDK em um projeto diferente,
defina o projeto gcloud
como o ID do projeto do App Engine que você está usando
para o Firenotes. Em Como gerenciar configurações do SDK Google Cloud, consulte
comandos específicos para atualizar um projeto com a ferramenta gcloud
.
Como clonar o app de amostra
Para fazer o download do exemplo na máquina local:
Clone o repositório de aplicativos de exemplo na máquina local:
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
Também é possível fazer o download do exemplo como um arquivo zip e extraí-lo.
Navegue até o diretório que contém o código de exemplo:
Para configurar o FirebaseUI e ativar provedores de identidade:cd python-docs-samples/appengine/standard/firebase/firenotes
Siga as seguintes etapas para adicionar o Firebase ao seu app:
- Crie um projeto do Firebase no Console do Firebase.
- Se você não tiver um projeto do Firebase atual, clique em Adicionar projeto e insira um nome de projeto atual do Google Cloud ou um novo nome de projeto.
- Se você tiver um projeto do Firebase que gostaria de usar, selecione-o no console.
- Na página de visão geral do projeto, clique em Adicionar o Firebase ao seu aplicativo da Web. Se seu projeto já tiver um aplicativo, selecione Adicionar aplicativo na página de visão geral do projeto.
Use a seção
Initialize Firebase
do snippet de código personalizado do seu projeto para preencher a seguinte seção do arquivofrontend/main.js
:
- Crie um projeto do Firebase no Console do Firebase.
No arquivo
frontend/main.js
, configure o widget de login do FirebaseUI selecionando quais provedores você quer oferecer aos usuários.Ative os provedores que você escolheu manter no Console do Firebase clicando em Autenticação > Método de login. Em seguida, em Provedores de login, passe o cursor sobre um provedor e clique no ícone de lápis.
Alterne o botão Ativar e, para provedores de identidade de terceiros, insira o ID do provedor e o secret do site do provedor para desenvolvedores. A documentação do Firebase contém instruções específicas nas seções "Antes de começar" dos guias do Facebook, do Twitter e do GitHub. Depois de ativar um provedor, clique em Salvar.
No Console do Firebase, em Domínios autorizados, clique em Adicionar domínio e insira o domínio do aplicativo do App Engine no seguinte formato:
[PROJECT_ID].appspot.com
Não inclua
http://
antes do nome do domínio.
Como instalar dependências
Navegue até o diretório
backend
e conclua a configuração do aplicativo:cd backend/
Instale as dependências em um diretório
lib
do projeto:pip install -t lib -r requirements.txt
Em
appengine_config.py
, o métodovendor.add()
registra as bibliotecas no diretóriolib
.
Como executar o aplicativo localmente
Para executar o aplicativo localmente, use o servidor de desenvolvimento local do App Engine:
Adicione o seguinte URL como
backendHostURL
emmain.js
:http://localhost:8081
Navegue até o diretório raiz do aplicativo. Em seguida, inicie o servidor de desenvolvimento:
dev_appserver.py frontend/app.yaml backend/app.yaml
Acesse http://localhost:8080/ em um navegador da Web.
Como autenticar usuários no servidor
Agora que você configurou um projeto e inicializou um aplicativo para desenvolvimento, é possível percorrer o código para entender como recuperar e verificar os tokens de código do Firebase no servidor.
Como receber um token de código do Firebase
A primeira etapa na autenticação do lado do servidor é recuperar um token de acesso para
verificar. As solicitações de autenticação são tratadas com o listener onAuthStateChanged()
do Firebase:
Quando um usuário está conectado, o método getToken()
do Firebase no
callback retorna um token de ID do Firebase na forma de um JSON Web
Token (JWT).
Como verificar tokens no servidor
Depois que um usuário faz login, o serviço de front-end busca qualquer anotação atual no
notebook do usuário por meio de uma solicitação AJAX GET
. Isso requer autorização para
acessar os dados do usuário, de modo que o JWT seja enviado no cabeçalho Authorization
da
solicitação usando o esquema Bearer
:
Antes que o cliente possa acessar os dados do servidor, o servidor precisa verificar se o token está assinado pelo Firebase. É possível verificar esse token usando a
Biblioteca de autenticação do Google para Python.
Use a função
verify_firebase_token
da biblioteca de autenticação para verificar o token do portador e extrair as declarações:
Cada provedor de identidade envia um conjunto diferente de declarações, mas cada um tem pelo menos uma declaração
sub
com um ID de usuário exclusivo e uma declaração que fornece algumas informações de perfil,
como name
ou email
, que podem ser usadas para personalizar a experiência
do usuário no seu aplicativo.
Como gerenciar dados do usuário no Datastore
Depois de autenticar um usuário, você precisa armazenar os dados correspondentes para que isso persista após o término de uma sessão de login. Nas seções a seguir, explicamos como armazenar uma anotação como uma entidade do Datastore e segregar entidades por ID de usuário.
Como criar entidades para armazenar dados de usuário
É possível criar uma entidade no Datastore declarando uma
classe de modelo NDB com
determinadas propriedades, como números inteiros ou strings. O Datastore indexa
entidades por tipo. No caso do Firenotes, o tipo de cada entidade é Note
.
Para fins de consulta, cada Note
é armazenado com um nome de chave, que é o
ID de usuário conseguido da declaração sub
na seção anterior.
No código a seguir, demonstramos como definir propriedades de uma entidade, com o método construtor para a classe de modelo quando a entidade é criada e por meio da atribuição de propriedades individuais após a criação:
Para gravar o Note
recém-criado no Datastore, chame o método put()
no objeto note
.
Como recuperar dados de usuário
Para recuperar dados do usuário associados a um ID de usuário específico, use o método
query()
do NDB para pesquisar no banco de dados as anotações no mesmo grupo de entidades.
As entidades no mesmo grupo ou
caminho do ancestral
têm o mesmo nome de chave, que, nesse caso, é o ID de usuário.
Com isso, você pode buscar os dados da consulta e exibir as anotações no cliente:
Como implantar o app
Você integrou com êxito o Firebase Authentication ao aplicativo do App Engine. Para ver o aplicativo em execução em um ambiente de produção real, siga estas etapas:
- Altere o URL do host de back-end em
main.js
parahttps://backend-dot-[PROJECT_ID].appspot.com
. Substitua[PROJECT_ID]
pelo ID do projeto: Implante o aplicativo usando a interface da linha de comando do SDK Google Cloud:
gcloud app deploy backend/index.yaml frontend/app.yaml backend/app.yaml
Veja o aplicativo ao vivo em
https://[PROJECT_ID].appspot.com
.
Limpeza
Para evitar cobranças na sua conta do Google Cloud pelos recursos usados neste tutorial, exclua o projeto do App Engine:
Como excluir o projeto
O jeito mais fácil de evitar cobranças é excluindo o projeto que você criou para o tutorial.
Para excluir o projeto:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
A seguir
- Confira arquiteturas de referência, diagramas, tutoriais e práticas recomendadas do Google Cloud. Confira o Centro de arquitetura do Cloud.