Informazioni su questo codelab
1. Introduzione
Spesso l'autenticazione degli utenti di un'app web è un'operazione necessaria e, in genere, richiede una programmazione speciale nell'app. Per le app di Google Cloud Platform puoi delegare queste responsabilità al servizio Identity-Aware Proxy. Se devi semplicemente limitare l'accesso a utenti selezionati, non sono necessarie modifiche all'applicazione. Se l'applicazione deve conoscere l'identità dell'utente (ad esempio per memorizzare le preferenze dell'utente sul lato server), Identity-Aware Proxy può fornirla tramite un codice dell'applicazione minimo.
Che cos'è Identity-Aware Proxy?
Identity-Aware Proxy (IAP) è un servizio di Google Cloud Platform che intercetta le richieste web inviate alla tua applicazione, autentica l'utente che fa la richiesta utilizzando Google Identity Service e fa passare solo le richieste che provengono da un utente che hai autorizzato. Inoltre, può modificare le intestazioni della richiesta per includere informazioni sull'utente autenticato.
Questo codelab ti guiderà attraverso la creazione di un'applicazione, la limitazione dell'accesso all'applicazione e il recupero dell'identità utente da IAP.
Cosa creerai
In questo codelab, creerai un'applicazione web minima con Google App Engine, quindi esplorerai vari modi di utilizzare Identity-Aware Proxy per limitare l'accesso all'applicazione e fornirvi informazioni sull'identità utente. La tua app sarà in grado di:
|
Cosa imparerai a fare
- Scrivere ed eseguire il deployment di una semplice app di App Engine con Python 3.7
- Abilitare e disabilitare IAP per limitare l'accesso all'app
- Far arrivare le informazioni sull'identità utente da IAP alla tua app
- Verificare tramite crittografia le informazioni ricevute da IAP per proteggerle dallo spoofing
Che cosa ti serve
- Un browser web moderno come Chrome.
- Conoscenza di base del linguaggio di programmazione Python
Questo codelab è incentrato su Google App Engine e IAP. Concetti e blocchi di codice non pertinenti sono trattati solo superficialmente e sono forniti solo per operazioni di copia e incolla.
2. Preparazione
Lavorerai nell'ambiente a riga di comando di Cloud Shell. Per prima cosa, apri l'ambiente e recupera il codice campione.
Avvia la console e Cloud Shell
Nella parte superiore sinistra della pagina del lab, fai clic sul pulsante Apri console Google. Dovrai accedere con il nome utente e la password mostrati sotto il pulsante. |
Tutti i comandi in questo codelab verranno eseguiti all'interno di Cloud Shell per il progetto che è stato creato e aperto per te. Apri Cloud Shell facendo clic sull'icona Attiva Cloud Shell che si trova sul lato destro dell'intestazione della pagina della console. Nella metà inferiore della pagina potrai inserire ed eseguire i comandi.I comandi possono essere eseguiti dal tuo PC, ma prima dovrai installare e configurare il software di sviluppo necessario. Cloud Shell include già tutti gli strumenti software di cui hai bisogno. |
Scarica il codice
Fai clic sull'area della riga di comando in Cloud Shell per digitare i comandi. Recupera il codice da GitHub, quindi passa alla cartella del codice:
git clone https://github.com/googlecodelabs/user-authentication-with-iap.git
cd user-authentication-with-iap
Questa cartella contiene una sottocartella per ogni passaggio di questo codelab. Dovrai passare alla cartella corretta per eseguire i singoli passaggi.
3. Passaggio 1 - Esegui il deployment dell'applicazione e proteggila con IAP
Questa è un'applicazione standard di App Engine scritta in Python 3.7 che visualizza semplicemente un messaggio "Hello World" pagina di benvenuto. Eseguiremo il deployment e la testeremo, quindi ne limiteremo l'accesso utilizzando IAP.
Esamina il codice dell'applicazione
Passa dalla cartella del progetto principale alla sottocartella 1-HelloWorld
che contiene il codice da utilizzare in questo passaggio.
cd 1-HelloWorld
Il codice dell'applicazione è nel file main.py
. Utilizza il framework web Flask per rispondere alle richieste web con i contenuti di un modello. Il file modello si trova in templates/index.html
e per questo passaggio contiene solo HTML normale. Un secondo file modello contiene uno schema essenziale di norme sulla privacy di esempio in templates/privacy.html
.
Sono presenti due altri file: requirements.txt
elenca tutte le librerie Python non predefinite utilizzate dall'applicazione e app.yaml
indica a Google Cloud Platform che questa è un'applicazione App Engine in Python 3.7.
Puoi elencare ciascun file della shell utilizzando il comando cat, ad esempio:
cat main.py
Oppure puoi aprire l'editor di codice di Cloud Shell facendo clic sull'icona a forma di matita in alto a destra nella finestra di Cloud Shell ed esaminare il codice in questo modo.
Per questo passaggio non è necessario modificare alcun file.
Esegui il deployment in App Engine
Ora esegui il deployment dell'app nell'ambiente standard di App Engine per Python 3.7.
gcloud app deploy
Ti potrebbe essere chiesto di scegliere una regione in cui eseguire il deployment. Seleziona una delle posizioni nelle vicinanze con la dicitura "supporta lo standard". Quando ti viene chiesto se vuoi continuare, inserisci Y
per indicare sì.
In pochi minuti il deployment dovrebbe essere completato e vedrai un messaggio che ti informa che puoi visualizzare la tua applicazione con gcloud app browse
. Inserisci il comando. Se nel browser non si apre una nuova scheda, fai clic sul link visualizzato per aprirla in una nuova scheda o, se necessario, copiala in una nuova scheda aperta manualmente. Poiché questa è la prima volta che l'app viene eseguita, serviranno alcuni secondi perché sia visualizzata e si avvii l'istanza cloud; dovresti vedere la finestra seguente.
Puoi aprire lo stesso URL da qualsiasi computer connesso a internet per vedere la pagina web. L'accesso non è ancora limitato.
Limitare l'accesso con IAP
Nella finestra della console Cloud, fai clic sull'icona del menu in alto a sinistra nella pagina, quindi su Sicurezza e quindi su Identity-Aware Proxy. | |
Poiché è la prima volta che attivi un'opzione di autenticazione per il progetto, visualizzerai un messaggio che ti informa che devi configurare la schermata per il consenso OAuth prima di poter utilizzare IAP. | |
Fai clic sul PULSANTE CONFIGURA SCHERMATA DI CONSENSO. Si aprirà una nuova scheda per configurare la schermata per il consenso. |
Compila i campi richiesti con i valori appropriati:
Nome applicazione | Esempio di IAP |
Email dell'assistenza | il tuo indirizzo email. potrebbe essere già stato compilato. |
Dominio autorizzato | la parte del nome host dell'URL dell'applicazione, ad esempio iap-example-999999.appspot.com. Lo puoi vedere nella barra degli indirizzi della pagina web Hello World aperta in precedenza. Non includere il carattere |
Link alla home page dell'applicazione | L'URL utilizzato per visualizzare l'app |
Link alle norme sulla privacy dell'applicazione | Il link alla pagina della privacy nell'app è uguale al link della home page con l'aggiunta di /privacy alla fine |
Fai clic su Salva. Ti verrà chiesto di creare le credenziali. Non è necessario creare le credenziali per questo codelab, quindi puoi semplicemente chiudere questa scheda del browser.
Torna alla pagina Identity-Aware Proxy e aggiornala. A questo punto dovresti vedere un elenco di risorse che puoi proteggere.Fai clic sul pulsante di attivazione/disattivazione nella colonna IAP della riga dell'app di App Engine per attivarlo. | |
Vedrai i nomi di dominio protetti da IAP. Fai clic su ATTIVA. | |
Ora apri una scheda del browser e vai all'URL della tua app. Verrà visualizzata una schermata Accedi con Google in cui ti viene chiesto di eseguire l'accesso per poter accedere all'app. | |
Accedi con un account Google o G Suite. Verrà visualizzata una schermata che ti nega l'accesso. |
La tua app è correttamente protetta tramite IAP, ma non hai ancora specificato in IAP quali account possono accedere.
Torna alla pagina Identity-Aware Proxy della console e seleziona la casella di controllo accanto all'app App Engine, quindi dai uno sguardo alla barra laterale a destra nella pagina. | |
Devi aggiungere come membri tutti gli indirizzi email (o indirizzi di Google Gruppi o nomi di dominio G Suite) che devono essere autorizzati ad accedere. Fai clic su AGGIUNGI MEMBRO. Inserisci il tuo indirizzo email, quindi scegli il ruolo Utente applicazione web con protezione IAP/Cloud IAP da assegnare a quell'indirizzo. Puoi inserire altri indirizzi o domini G Suite nello stesso modo. |
Fai clic su Save (Salva). In fondo alla finestra viene visualizzato il messaggio "Criterio aggiornato".
Torna alla tua app e ricarica la pagina. A questo punto dovresti vedere la tua app web, in quanto hai già eseguito l'accesso con un utente autorizzato. Tuttavia, potresti ancora visualizzare il messaggio "Non disponi dei diritti di accesso" pagina poiché IAP potrebbe non ricontrollare la tua autorizzazione. In questo caso, segui questi passaggi:
- Apri il browser web all'indirizzo della home page con
/_gcp_iap/clear_login_cookie
aggiunto alla fine dell'URL, ad esempiohttps://iap-example-999999.appspot.com/_gcp_iap/clear_login_cookie
. - Viene visualizzata una nuova schermata Accedi con Google relativa al tuo account. Non fare clic sull'account, seleziona invece Utilizza un altro account e reinserisci le tue credenziali.
- Questa procedura fa sì che IAP verifichi nuovamente il tuo accesso. A questo punto dovresti vedere la schermata iniziale della tua applicazione.
Se hai accesso a un altro browser oppure alla Modalità di navigazione in incognito in quello in uso e disponi di un altro account Gmail o G Suite valido, puoi utilizzare quel browser per andare alla pagina della tua app e accedere con l'altro account. Dal momento che quell'account non è autorizzato, invece della tua app vedrai la schermata "Non disponi dei diritti di accesso".
4. Passaggio 2: accedi alle informazioni sull'identità utente
Quando un'app è protetta con IAP, può utilizzare le informazioni sull'identità che IAP fornisce nelle intestazioni delle richieste web che lascia passare. In questo passaggio, l'applicazione riceve l'indirizzo email dell'utente che ha eseguito l'accesso e un ID utente univoco assegnato dal servizio di identità Google (Google Identity Service) a quell'utente. I dati vengono mostrati all'utente nella pagina di benvenuto.
Questo è il passaggio 2 e l'ultimo passaggio è terminato con Cloud Shell aperto nella cartella iap-codelab/1-HelloWorld
. In questo passaggio, cambia cartella:
cd ~/iap-codelab/2-HelloUser
Esegui il deployment in App Engine
Poiché il deployment richiede alcuni minuti, inizia a eseguire il deployment dell'app nell'ambiente App Engine Standard per Python 3.7:
gcloud app deploy
Quando ti viene chiesto se vuoi continuare, digita Y per indicare sì. Il deployment dovrebbe completarsi in pochi minuti. Mentre aspetti, puoi esaminare i file dell'applicazione descritti di seguito.
Quando il deployment è pronto, un messaggio confermerà che puoi visualizzare l'applicazione con gcloud app browse
. Inserisci il comando. Se nel browser non si apre una nuova scheda, copia il link visualizzato in una nuova scheda come faresti normalmente. Dovresti visualizzare una pagina simile alla seguente:
Potresti dover attendere qualche minuto prima che la nuova versione della tua applicazione sostituisca quella precedente. Se necessario, aggiorna la pagina. Dovresti vedere una pagina simile a quella riportata sopra.
Esamina i file dell'applicazione
Questa cartella contiene lo stesso set di file di cui al passaggio 1, ma due file sono stati modificati: main.py
e templates/index.html
. Il programma è stato cambiato per recuperare le informazioni utente che IAP fornisce nelle intestazioni delle richieste: ora il modello visualizza quei dati.
In main.py
sono presenti due righe che recuperano i dati di identità forniti da IAP:
user_email = request.headers.get('X-Goog-Authenticated-User-Email')
user_id = request.headers.get('X-Goog-Authenticated-User-ID')
Le intestazioni X-Goog-Authenticated-User-
sono fornite da IAP; i nomi sono senza distinzione tra maiuscole e minuscole, pertanto possono essere forniti a caratteri tutti minuscoli o tutti maiuscoli, se preferisci. L'istruzione render_template ora include quei valori, che possono quindi essere visualizzati:
page = render_template('index.html', email=user_email, id=user_id)
Il template index.html può visualizzare quei valori racchiudendo i nomi tra doppie parentesi graffe:
Hello, {{ email }}! Your persistent ID is {{ id }}.
Come puoi vedere, i dati forniti sono preceduti dal prefisso accounts.google.com
, per indicare da dove provengono le informazioni. La tua applicazione può rimuovere tutto fino ai due punti inclusi per prendere i valori non elaborati, se opportuno.
Disattiva IAP
Che cosa succede all'app se IAP viene disattivato o in qualche modo ignorato, ad esempio da altre applicazioni in esecuzione nello stesso progetto cloud? Disattiva IAP per scoprirlo.
Nella finestra della console Cloud, fai clic sull'icona del menu in alto a sinistra nella pagina, quindi su Sicurezza e quindi su Identity-Aware Proxy. Fai clic sull'opzione attiva/disattiva di IAP accanto all'app di App Engine per disattivarlo. |
Sarà visualizzato un avviso che informa che tutti gli utenti potranno accedere all'app.
Aggiorna la pagina web dell'applicazione. Dovresti vedere la stessa pagina ma senza alcuna informazione utente:
Ora che l'applicazione non è più protetta, un utente potrebbe inviare una richiesta web che sembra essere passata attraverso IAP. Ad esempio, per farlo, puoi eseguire il seguente comando curl da Cloud Shell (sostituisci <your-url-here> con l'URL corretto della tua app):
curl -X GET <your-url-here> -H "X-Goog-Authenticated-User-Email: totally fake email"
La pagina web sarà visualizzata sulla riga di comando e avrà questo aspetto:
<!doctype html> <html> <head> <title>IAP Hello User</title> </head> <body> <h1>Hello World</h1> <p> Hello, totally fake email! Your persistent ID is None. </p> <p> This is step 2 of the <em>User Authentication with IAP</em> codelab. </p> </body> </html>
L'applicazione non è in grado in alcun modo di sapere che IAP è stato disattivato o ignorato. Per i casi in cui questo è un rischio potenziale, il passaggio 3 mostra una soluzione.
5. Passaggio 3: utilizza la verifica crittografica
Se esiste il rischio che IAP sia disattivato o ignorato, la tua app può eseguire un controllo per verificare che le informazioni sull'identità ricevute siano valide. A questo scopo viene utilizzata una terza intestazione della richiesta web aggiunta da IAP e denominata X-Goog-IAP-JWT-Assertion
. Il valore dell'intestazione è un oggetto firmato in modo crittografico che contiene anche i dati dell'identità utente. La tua applicazione può verificare la firma digitale e utilizzare i dati forniti nell'oggetto per avere la certezza che siano forniti da IAP senza alterazioni.
La verifica della firma digitale richiede vari altri passaggi, quali ad esempio il recupero del set più recente di chiavi pubbliche di Google. Puoi decidere se la tua applicazione necessita di questi ulteriori passaggi in base al rischio che qualcuno possa disattivare o ignorare l'IAP e alla sensibilità dell'applicazione.
Questo è il passaggio 3 e l'ultimo passaggio è terminato con Cloud Shell aperto nella cartella iap-codelab/2-HelloUser
. In questo passaggio, cambia cartella:
cd ~/iap-codelab/3-HelloVerifiedUser
Esegui il deployment in App Engine
Esegui il deployment dell'app nell'ambiente standard di App Engine per Python 3.7:
gcloud app deploy
Quando ti viene chiesto se vuoi continuare, digita Y per indicare sì. Il deployment dovrebbe completarsi in pochi minuti. Mentre aspetti, puoi esaminare i file dell'applicazione descritti di seguito.
Quando il deployment è pronto, un messaggio confermerà che puoi visualizzare l'applicazione con gcloud app browse
. Inserisci il comando. Se nel browser non si apre una nuova scheda, copia il link visualizzato in una nuova scheda come faresti normalmente.
Ricorda che hai disattivato IAP nel passaggio 2, quindi non vengono forniti dati IAP all'applicazione. Dovresti visualizzare una pagina simile alla seguente:
Come in precedenza, potrebbe essere necessario attendere qualche minuto perché la nuova versione sia pubblicata e visibile online.
Dal momento che IAP è disattivato, non sono disponibili informazioni utente. A questo punto, riattiva IAP.
Nella finestra della console Cloud, fai clic sull'icona del menu in alto a sinistra nella pagina, quindi su Sicurezza e quindi su Identity-Aware Proxy. Fai clic sull'opzione attiva/disattiva di IAP accanto all'app di App Engine per riattivarlo. |
Aggiorna la pagina. La pagina deve avere il seguente aspetto:
Tieni presente che l'indirizzo email fornito dal metodo verificato non ha il prefisso accounts.google.com:
.
Se IAP è disattivato o ignorato, i dati verificati mancano o non sono validi, in quanto non possono avere una firma valida a meno che non siano creati da chi detiene le chiavi private di Google.
Esamina i file dell'applicazione
Questa cartella contiene lo stesso set di file mostrato nel passaggio 2, con due file modificati e un nuovo file. Il nuovo file è auth.py
e fornisce un metodo user()
per recuperare e verificare le informazioni sull'identità firmate tramite crittografia. I file modificati sono main.py
e templates/index.html
, che ora utilizzano i risultati di quel metodo. Vengono mostrate anche a scopo di confronto le intestazioni non verificate presenti nel passaggio 2.
La nuova funzionalità consiste principalmente nella funzione user()
:
def user():
assertion = request.headers.get('X-Goog-IAP-JWT-Assertion')
if assertion is None:
return None, None
info = jwt.decode(
assertion,
keys(),
algorithms=['ES256'],
audience=audience()
)
return info['email'], info['sub']
assertion
indica i dati firmati in forma criptata forniti nell'intestazione della richiesta specificata. Il codice utilizza una libreria per convalidare e decodificare quei dati. La convalida utilizza le chiavi pubbliche che Google fornisce per controllare i dati che firma e per conoscere i destinatari per cui i dati sono stati preparati (in pratica il progetto Google Cloud che viene protetto). Le funzioni helper keys()
e audience()
raccolgono e restituiscono questi valori.
L'oggetto firmato contiene due dati che ci servono: l'indirizzo email verificato e il valore ID univoco (fornito nel campo standard sub
per l'abbonato).
Il passaggio 3 è completato.
6. Riepilogo
Hai eseguito il deployment di un'applicazione web di App Engine. Nel passaggio 1, hai limitato l'accesso all'applicazione ai soli utenti scelti da te. Nel passaggio 2, hai recuperato e visualizzato l'identità degli utenti a cui IAP ha consentito l'accesso alla tua applicazione e hai visto come le informazioni potrebbero essere soggette a spoofing se IAP viene disattivato o ignorato. Nel passaggio 3 hai verificato le asserzioni con firma criptata dell'identità utente, che non possono essere soggette a spoofing.
7. Esegui la pulizia
Le uniche risorse della piattaforma Google Cloud che hai utilizzato in questo codelab sono istanze di App Engine. Ogni volta che eseguivi il deployment dell'app, è stata creata una nuova versione che continua a esistere fino all'eliminazione. Esci dal lab per eliminare il progetto e tutte le risorse al suo interno.