Questo tutorial mostra come recuperare, verificare e archiviare le credenziali utente utilizzando Firebase Authentication, l'ambiente standard di App Engine e Datastore.
Questo documento illustra una semplice applicazione per scrivere note chiamata Firenotes, che memorizza gli appunti degli utenti nei loro blocchi note personali. Notebooks vengono archiviati per utente e identificati in base all'ID di autenticazione Firebase univoco di ciascun utente. L'applicazione include i seguenti componenti:
Il frontend configura l'interfaccia utente di accesso e recupera l'ID di autenticazione Firebase. Gestisce inoltre le modifiche dello stato di autenticazione e consente agli utenti di vedere le note.
FirebaseUI è una soluzione open source che semplifica le attività di autenticazione e UI. L'SDK gestisce l'accesso degli utenti, il collegamento di più provider a un unico account, il recupero delle password e altro ancora. Implementa le best practice di autenticazione per un'esperienza di accesso semplice e sicura.
Il backend verifica lo stato di autenticazione dell'utente e restituisce le informazioni del profilo utente e le note dell'utente.
L'applicazione archivia le credenziali utente in Datastore utilizzando la libreria client NDB, ma puoi archiviare le credenziali in un database a tua scelta.
Il seguente diagramma mostra in che modo il frontend e il backend comunicano tra loro e in che modo le credenziali utente vengono trasferite da Firebase al database.Firenotes si basa sul framework di applicazioni web Flask. L'app di esempio utilizza Flask per la sua semplicità e facilità d'uso, ma i concetti e le tecnologie esplorati sono applicabili indipendentemente dal framework utilizzato.
Obiettivi
Se completi questo tutorial, sarai in grado di:
- Configura l'interfaccia utente di Firebase Authentication.
- Ottenere un token ID Firebase e verificarlo utilizzando l'autenticazione lato server.
- Archiviare le credenziali utente e i dati associati in Datastore.
- Query su un database utilizzando la libreria client NDB.
- Eseguire il deployment di un'app in App Engine.
Costi
Questo tutorial utilizza i componenti fatturabili di Google Cloud, tra cui:
- Datastore
Utilizza il Calcolatore prezzi
per generare una stima dei costi in base all'utilizzo previsto.
Prima di iniziare
- Installa Git, Python 2.7 e virtualenv. Per ulteriori informazioni sulla configurazione dell'ambiente di sviluppo Python, ad esempio sull'installazione della versione più recente di Python, consulta la sezione Configurazione di un ambiente di sviluppo Python per 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 hai già installato e inizializzato l'SDK in un altro progetto, imposta il progetto gcloud
sull'ID del progetto App Engine che stai utilizzando per Firenotes. Consulta la sezione Gestione delle configurazioni di Google Cloud SDK per i comandi specifici che consentono di aggiornare un progetto con lo strumento gcloud
.
Clonazione dell'app di esempio
Per scaricare l'esempio sul computer locale:
Clona il repository dell'applicazione di esempio sulla tua macchina locale:
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
In alternativa, puoi scaricare l'esempio come file ZIP ed estrarlo.
Vai alla directory che contiene il codice campione:
Per configurare FirebaseUI e abilitare i provider di identità:cd python-docs-samples/appengine/standard/firebase/firenotes
Per aggiungere Firebase alla tua app:
- Crea un progetto Firebase nella console Firebase.
- Se non hai ancora un progetto Firebase, fai clic su Aggiungi progetto e inserisci il nome di un progetto Google Cloud esistente o di un nuovo nome.
- Se hai già un progetto Firebase che vuoi utilizzare, selezionalo dalla console.
- Nella pagina della panoramica del progetto, fai clic su Aggiungi Firebase alla tua app web. Se il progetto include già un'app, seleziona Aggiungi app dalla pagina della panoramica del progetto.
Usa la sezione
Initialize Firebase
dello snippet di codice personalizzato del tuo progetto per compilare la seguente sezione del filefrontend/main.js
:
- Crea un progetto Firebase nella console Firebase.
Nel file
frontend/main.js
, configura il widget di accesso FirebaseUI selezionando i provider che vuoi offrire agli utenti.Abilita i provider che hai scelto di conservare nella console di Firebase facendo clic su Autenticazione > Metodo di accesso. Quindi, in Fornitori di accesso, passa il mouse sopra un fornitore e fai clic sull'icona a forma di matita.
Attiva/disattiva il pulsante Abilita e, per i provider di identità di terze parti, inserisci l'ID e il secret del provider indicati nel sito per sviluppatori del provider. I documenti di Firebase forniscono istruzioni specifiche nella sezione "Prima di iniziare" delle guide di Facebook, Twitter e GitHub. Dopo aver abilitato un provider, fai clic su Salva.
Nella console Firebase, in Domini autorizzati, fai clic su Aggiungi dominio e inserisci il dominio della tua app su App Engine nel seguente formato:
[PROJECT_ID].appspot.com
Non includere
http://
prima del nome di dominio.
Installazione delle dipendenze
Vai alla directory
backend
e completa la configurazione dell'applicazione:cd backend/
Installa le dipendenze in una directory
lib
nel tuo progetto:pip install -t lib -r requirements.txt
In
appengine_config.py
, il metodovendor.add()
registra le librerie nella directorylib
.
Esecuzione dell'applicazione in locale
Per eseguire l'applicazione localmente, utilizza il server di sviluppo locale di App Engine:
Aggiungi il seguente URL come
backendHostURL
inmain.js
:http://localhost:8081
Vai alla directory principale dell'applicazione. Poi avvia il server di sviluppo:
dev_appserver.py frontend/app.yaml backend/app.yaml
Visita la pagina http://localhost:8080/ su un browser web.
Autenticazione degli utenti sul server
Ora che hai configurato un progetto e inizializzato un'applicazione per lo sviluppo, puoi attraversare il codice per capire come recuperare e verificare i token ID Firebase sul server.
Ottenere un token ID da Firebase
Il primo passaggio dell'autenticazione lato server consiste nel recuperare un token di accesso per la verifica. Le richieste di autenticazione vengono gestite con l'ascoltatore onAuthStateChanged()
di Firebase:
Quando un utente ha eseguito l'accesso, il metodo getToken()
di Firebase nel callback restituisce un token ID Firebase sotto forma di token JWT (JSON Web Token).
Verifica dei token sul server
Dopo che un utente ha eseguito l'accesso, il servizio di frontend recupera tutte le note esistenti nel blocco note dell'utente tramite una richiesta GET
AJAX. Ciò richiede l'autorizzazione per accedere ai dati dell'utente, quindi il JWT viene inviato nell'intestazione Authorization
della richiesta utilizzando lo schema Bearer
:
Prima che il client possa accedere ai dati del server, il server deve verificare che il token sia firmato da Firebase. Puoi verificare questo token utilizzando la libreria di autenticazione di Google per Python.
Utilizza la funzione verify_firebase_token
della libreria di autenticazione per verificare il token di connessione ed estrarre le attestazioni:
Ogni provider di identità invia un insieme diverso di rivendicazioni, ma ognuna ha almeno una rivendicazione sub
con un ID utente univoco e una rivendicazione che fornisce alcune informazioni del profilo, come name
o email
, che puoi utilizzare per personalizzare l'esperienza utente sulla tua app.
Gestione dei dati utente in Datastore
Dopo l'autenticazione di un utente, devi archiviare i suoi dati in modo che vengano conservati al termine di una sessione di accesso. Le seguenti sezioni spiegano come archiviare una nota come entità Datastore e separare le entità in base allo User-ID.
Creazione di entità per archiviare i dati utente
È possibile creare un'entità in Datastore dichiarando una classe del modello NDB con determinate proprietà, come numeri interi o stringhe. Datastore indicizza le entità per kind; nel caso di Firenotes, il tipo di ogni entità è Note
.
Ai fini delle query, ogni Note
viene archiviato con un nome chiave, che corrisponde all'ID utente ottenuto dalla rivendicazione sub
nella sezione precedente.
Il codice seguente mostra come impostare le proprietà di un'entità, sia con il metodo del costruttore per la classe del modello al momento della creazione dell'entità sia tramite l'assegnazione di singole proprietà dopo la creazione:
Per scrivere il Note
appena creato in Datastore, chiama il metodo put()
nell'oggetto note
.
Recupero dei dati utente
Per recuperare i dati utente associati a un determinato ID utente, utilizza il metodo NDB
query()
per cercare nel database le note relative allo stesso gruppo di entità.
Le entità nello stesso gruppo o nel percorso predecessore condividono un nome di chiave comune, che in questo caso è lo User-ID.
Puoi quindi recuperare i dati della query e visualizzare le note nel client:
Deployment dell'app
Hai integrato correttamente Firebase Authentication con l'applicazione App Engine. Per visualizzare la tua applicazione in esecuzione in un ambiente di produzione attivo:
- Cambia l'URL dell'host di backend in
main.js
inhttps://backend-dot-[PROJECT_ID].appspot.com
. Sostituisci[PROJECT_ID]
con l'ID progetto. Esegui il deployment dell'applicazione utilizzando l'interfaccia a riga di comando di Google Cloud SDK:
gcloud app deploy backend/index.yaml frontend/app.yaml backend/app.yaml
Visualizza l'applicazione pubblicata su
https://[PROJECT_ID].appspot.com
.
Esegui la pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il tuo progetto App Engine:
Elimina il progetto
Il modo più semplice per eliminare la fatturazione è eliminare il progetto che hai creato per il tutorial.
Per eliminare il progetto:
- 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.
Passaggi successivi
- Esplora le architetture di riferimento, i diagrammi e le best practice su Google Cloud. Dai un'occhiata al nostro Cloud Architecture Center.