Quando un'app in esecuzione nell'ambiente di runtime Python 2 invia una richiesta a un'altra app App Engine, può utilizzare l'API App Identity di App Engine per dichiarare la propria identità. L'app che riceve la richiesta può utilizzare questa identità per determinare se deve elaborare la richiesta.
Se le tue app Python 3 devono verificare la propria identità quando inviano richieste ad altre app App Engine, puoi utilizzare i token ID OpenID Connect (OIDC) emessi e decodificati dalle API OAuth 2.0 di Google.
Ecco una panoramica dell'utilizzo dei token ID OIDC per dichiarare e verificare l'identità:
- Un'app App Engine denominata "App A" recupera un token ID dall'ambiente di runtime Google Cloud .
- L'app A aggiunge questo token a un'intestazione della richiesta appena prima di inviarla all'app B, che è un'altra app App Engine.
- L'app B utilizza le API OAuth 2.0 di Google per verificare il payload del token. Il payload decodificato contiene l'identità verificata dell'app A sotto forma di indirizzo email deaccount di serviziont predefinito dell'app A.
- L'app B confronta l'identità nel payload con un elenco di identità a cui è consentito rispondere. Se la richiesta proviene da un'app consentita, l'app B elabora la richiesta e risponde.
Questa guida descrive come aggiornare le app App Engine per utilizzare i token ID OpenID Connect (OIDC) per confermare l'identità e come aggiornare le altre app App Engine per utilizzare i token ID per verificare l'identità prima di elaborare una richiesta.
Differenze principali tra le API App Identity e OIDC
Le app nell'ambiente di runtime Python 2 non devono dichiarare esplicitamente l'identità. Quando un'app utilizza le librerie Python
httplib
,urllib
ourllib2
o il servizio di recupero URL di App Engine per inviare richieste in uscita, il runtime utilizza il servizio di recupero URL di App Engine per effettuare la richiesta. Se la richiesta viene inviata al dominioappspot.com
, URL Fetch asserisce automaticamente l'identità dell'app richiedente aggiungendo l'intestazioneX-Appengine-Inbound-Appid
alla richiesta. Questa intestazione contiene l'ID applicazione dell'app (chiamato anche ID progetto).Le app nell'ambiente di runtime Python 3 devono asserire esplicitamente l'identità recuperando un token ID OIDC dall'ambiente di runtime Google Cloud e aggiungendolo all'intestazione della richiesta. Dovrai aggiornare tutto il codice che invia richieste ad altre app App Engine in modo che le richieste contengano un token ID OIDC.
L'intestazione
X-Appengine-Inbound-Appid
di una richiesta contiene l'ID progetto dell'app che ha inviato la richiesta.Il payload del token ID OIDC di Google non identifica direttamente l'ID progetto dell'app stessa. Il token identifica invece il account di servizio con cui viene eseguita l'app, fornendo l'indirizzo email del account di servizio. Dovrai aggiungere del codice per estrarre il nome utente dal payload del token.
Se questo account di servizio è il service account App Engine predefinito a livello di app per il progetto, l'ID progetto si trova nell'indirizzo email del account di servizio. La parte del nome utente dell'indirizzo corrisponde all'ID progetto. In questo caso, il codice dell'app ricevente può cercarlo nell'elenco degli ID progetto da cui consentirà le richieste.
Tuttavia, se l'app richiedente utilizza un service account gestito dall'utente anziché il service account predefinito di App Engine, l'app ricevente può verificare solo l'identità di questo service account, che non definirà necessariamente l'ID progetto dell'app richiedente. In questo caso, l'app ricevente dovrà gestire un elenco di indirizzi email di account di servizio consentiti anziché un elenco di ID progetto consentiti.
Le quote per le chiamate all'API URL Fetch sono diverse dalle quote delle API OAuth 2.0 di Google per la concessione di token. Puoi visualizzare il numero massimo di token che puoi concedere al giorno nella schermata per il consenso OAuth della console.Google Cloud Né URL Fetch, né l'API App Identity né le API OAuth 2.0 di Google comportano costi di fatturazione.
Panoramica del processo di migrazione
Per eseguire la migrazione delle tue app Python in modo che utilizzino le API OIDC per dichiarare e verificare l'identità:
Nelle app che devono asserire l'identità quando inviano richieste ad altre app App Engine:
Attendi che l'app sia in esecuzione in un ambiente Python 3 per eseguire la migrazione ai token ID.
Sebbene sia possibile utilizzare i token ID nel runtime Python 2, i passaggi in Python 2 sono complessi e necessari solo temporaneamente finché non aggiorni l'app per l'esecuzione nel runtime Python 3.
Una volta che l'app è in esecuzione in Python 3, aggiornala per richiedere un token ID e aggiungerlo a un'intestazione della richiesta.
Nelle app che devono verificare l'identità prima di elaborare una richiesta:
Inizia eseguendo l'upgrade delle tue app Python 2 per supportare sia i token ID sia le identità dell'API App Identity. In questo modo, le tue app potranno verificare ed elaborare le richieste delle app Python 2 che utilizzano l'API App Identity o delle app Python 3 che utilizzano i token ID.
Una volta stabilizzate le app Python 2 di cui è stato eseguito l'upgrade, esegui la migrazione al runtime Python 3. Continua a supportare sia i token ID sia le identità dell'API App Identity finché non avrai la certezza che le app non debbano più supportare le richieste provenienti da app legacy.
Quando non hai più bisogno di elaborare le richieste delle app App Engine legacy, rimuovi il codice che verifica le identità dell'API App Identity.
Dopo aver testato le app, esegui il deployment dell'app che elabora le richieste per prima. Poi, esegui il deployment dell'app Python 3 aggiornata che utilizza i token ID per asserire l'identità.
Affermazione dell'identità
Attendi che la tua app venga eseguita in un ambiente Python 3, poi segui questi passaggi per eseguire l'upgrade dell'app per l'asserzione dell'identità con i token ID:
Installa la libreria client
google-auth
.Aggiungi codice per richiedere un token ID dalle API OAuth 2.0 di Google e aggiungi il token a un'intestazione della richiesta prima di inviarla.
Testa gli aggiornamenti.
Installazione della libreria client google-auth
per le app Python 3
Per rendere disponibile la libreria client google-auth
per la tua app Python3,
crea un file requirements.txt
nella stessa cartella del file app.yaml
e aggiungi la seguente riga:
google-auth
Quando esegui il deployment dell'app, App Engine scarica tutte le
dipendenze definite nel file requirements.txt
.
Per lo sviluppo locale, ti consigliamo di installare le dipendenze in un ambiente virtuale come venv.
Aggiungere codice per l'asserzione dell'identità
Cerca nel codice e trova tutte le istanze di invio di richieste ad altre app App Engine. Aggiorna queste istanze per eseguire le seguenti operazioni prima di inviare la richiesta:
Aggiungi le seguenti importazioni:
from google.auth.transport import requests as reqs from google.oauth2 import id_token
Utilizza
google.oauth2.id_token.fetch_id_token(request, audience)
per recuperare un token ID. Includi i seguenti parametri nella chiamata al metodo:request
: passa l'oggetto richiesta che stai per inviare.audience
: trasmetti l'URL dell'app a cui stai inviando la richiesta. In questo modo il token viene associato alla richiesta e non può essere utilizzato da un'altra app.Per chiarezza e specificità, ti consigliamo di trasmettere l'URL
appspot.com
che App Engine ha creato per il servizio specifico che riceve la richiesta, anche se utilizzi un dominio personalizzato per l'app.
Nell'oggetto della richiesta, imposta la seguente intestazione:
'Authorization': 'ID {}'.format(token)
Ad esempio:
Aggiornamenti dei test per l'asserzione dell'identità
Per eseguire l'app in locale e verificare se può inviare correttamente i token ID:
Segui questi passaggi per rendere disponibili le credenziali dell'account di servizio App Engine predefinito nel tuo ambiente locale (le API Google OAuth richiedono queste credenziali per generare un token ID):
Inserisci il seguente comando
gcloud
per recuperare la chiave dell'account di servizio per l'account App Engine predefinito del tuo progetto:gcloud iam service-accounts keys create ~/key.json --iam-account project-ID@appspot.gserviceaccount.com
Sostituisci project-ID con l'ID del tuo Google Cloud progetto.
Il file della chiave del account di servizio viene scaricato sul computer. Puoi spostare e rinominare il file come preferisci. Assicurati di archiviare questo file in modo sicuro perché può essere utilizzato per l'autenticazione come service account. Se perdi il file o se il file viene esposto a utenti non autorizzati, elimina la account di servizio account e creane una nuova.
Inserisci questo comando:
<code>export GOOGLE_APPLICATION_CREDENTIALS=<var>service-account-key</var></code>
Sostituisci service-account-key con il nome del percorso assoluto del file che contiene la chiave delaccount di serviziot che hai scaricato.
Nella stessa shell in cui hai esportato la variabile di ambiente
GOOGLE_APPLICATION_CREDENTIALS
, avvia l'app Python.Invia una richiesta dall'app e verifica che vada a buon fine. Se non hai già un'app in grado di ricevere richieste e utilizzare i token ID per verificare le identità:
- Scarica l'app "in arrivo" di esempio.
Nel file
main.py
dell'esempio, aggiungi l'ID del tuo progetto Google Cloud aallowed_app_ids
. Ad esempio:allowed_app_ids = [ '<APP_ID_1>', '<APP_ID_2>', 'my-project-id' ]
Esegui l'esempio aggiornato nel server di sviluppo locale Python 2.
Verifica ed elaborazione delle richieste
Per eseguire l'upgrade delle tue app Python 2 in modo che utilizzino identità di token ID o API App Identity prima di elaborare le richieste:
Installa la libreria client google-auth.
Aggiorna il codice per eseguire le seguenti operazioni:
Se la richiesta contiene l'intestazione
X-Appengine-Inbound-Appid
, utilizzala per verificare l'identità. Le app in esecuzione in un runtime legacy come Python 2 conterranno questa intestazione.Se la richiesta non contiene l'intestazione
X-Appengine-Inbound-Appid
, controlla se è presente un token ID OIDC. Se il token esiste, verifica il payload del token e controlla l'identità del mittente.
Testa gli aggiornamenti.
Installazione della libreria client google-auth per le app Python 2
Per rendere disponibile la libreria client google-auth
per la tua app Python 2:
Crea un file
requirements.txt
nella stessa cartella del fileapp.yaml
e aggiungi la seguente riga:google-auth==1.19.2
Ti consigliamo di utilizzare la versione 1.19.2 della libreria client Cloud Logging poiché supporta le app Python 2.7.
Nel file
app.yaml
della tua app, specifica la libreria SSL nella sezionelibraries
se non è già specificata:libraries: - name: ssl version: latest
Crea una directory per archiviare le librerie di terze parti, ad esempio
lib/
. Quindi utilizzapip install
per installare le librerie nella directory. Ad esempio:pip install -t lib -r requirements.txt
Crea un file
appengine_config.py
nella stessa cartella del fileapp.yaml
. Aggiungi quanto segue al tuo fileappengine_config.py
:# appengine_config.py import pkg_resources from google.appengine.ext import vendor # Set path to your libraries folder. path = 'lib' # Add libraries installed in the path folder. vendor.add(path) # Add libraries to pkg_resources working set to find the distribution. pkg_resources.working_set.add_entry(path)
Il file
appengine_config.py
nell'esempio precedente presuppone che la cartellalib
si trovi nella directory di lavoro corrente. Se non puoi garantire chelib
si trovi sempre nella directory di lavoro corrente, specifica il percorso completo della cartellalib
. Ad esempio:import os path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib')
Per lo sviluppo locale, ti consigliamo di installare le dipendenze in un ambiente virtuale come virtualenv per Python 2.
Aggiornamento del codice per la verifica delle richieste
Cerca nel codice e trova tutte le istanze di recupero del valore dell'intestazione
X-Appengine-Inbound-Appid
. Aggiorna queste istanze per eseguire le seguenti operazioni:
Aggiungi le seguenti importazioni:
from google.auth.transport import requests as reqs from google.oauth2 import id_token
Se la richiesta in entrata non contiene l'intestazione
X-Appengine-Inbound-Appid
, cerca l'intestazioneAuthorization
e recuperane il valore.Il valore dell'intestazione è formattato come "ID: token".
Utilizza
google.oauth2.id_token.verify_oauth2_token(token, request, audience)
per verificare e recuperare il payload del token decodificato. Includi i seguenti parametri nella chiamata al metodo:token
: passa il token estratto dalla richiesta in entrata.request
: passa un nuovo oggettogoogle.auth.transport.Request
.audience
: trasmetti l'URL dell'app corrente (l'app che invia la richiesta di verifica). Il server di autorizzazione di Google confronterà questo URL con l'URL fornito al momento della generazione iniziale del token. Se gli URL non corrispondono, il token non verrà verificato e il server di autorizzazione restituirà un errore.
Il metodo
verify_oauth2_token
restituisce il payload del token decodificato, che contiene diverse coppie nome/valore, incluso l'indirizzo email dell'account di servizio predefinito per l'app che ha generato il token.Estrai il nome utente dall'indirizzo email nel payload del token.
Il nome utente corrisponde all'ID progetto dell'app che ha inviato la richiesta. Si tratta dello stesso valore restituito in precedenza nell'intestazione
X-Appengine-Inbound-Appid
.Se il nome utente/l'ID progetto è nell'elenco degli ID progetto consentiti, elabora la richiesta.
Ad esempio:
Aggiornamenti dei test per la verifica dell'identità
Per verificare che la tua app possa utilizzare un token ID o
l'intestazione X-Appengine-Inbound-Appid
per verificare le richieste, esegui l'app nel
server di sviluppo locale
Python 2 e invia richieste da app Python 2 (che utilizzeranno l'API App Identity) e
da app Python 3 che inviano token ID.
Se non hai aggiornato le tue app per inviare token ID:
Scarica l'app di esempio "richiesta".
Aggiungi le credenziali del account di servizio al tuo ambiente locale come descritto in Test degli aggiornamenti per le app di asserzione.
Utilizza i comandi Python 3 standard per avviare l'app di esempio Python 3.
Invia una richiesta dall'app di esempio e verifica che vada a buon fine.
Deployment delle app
Quando è tutto pronto per il deployment delle app, devi:
Se le app vengono eseguite senza errori, utilizza la suddivisione del traffico per aumentare gradualmente il traffico per le app aggiornate. Monitora attentamente le app per rilevare eventuali problemi prima di indirizzare più traffico verso le app aggiornate.
Utilizzo di un account di servizio diverso per l'asserzione dell'identità
Quando richiedi un token ID, la richiesta utilizza l'identità dell'account di servizio predefinito di App Engine per impostazione predefinita. Quando verifichi il token, il payload del token contiene l'indirizzo email dell'account di servizio predefinito, che corrisponde all'ID progetto della tua app.
Il service account predefinito di App Engine dispone di un livello di autorizzazione molto elevato per impostazione predefinita. Può visualizzare e modificare l'intero progettoGoogle Cloud , quindi nella maggior parte dei casi questo account non è appropriato da utilizzare quando l'app deve autenticarsi con i servizi cloud.
Tuttavia, l'account di servizio predefinito è sicuro da utilizzare per l'asserzione dell'identità dell'app perché utilizzi il token ID solo per verificare l'identità dell'app che ha inviato una richiesta. Le autorizzazioni effettive concesse all'account di servizio non vengono prese in considerazione o richieste durante questa procedura.
Se preferisci comunque utilizzare un altro account di servizio per le richieste di token ID, fai quanto segue:
Imposta una variabile di ambiente denominata
GOOGLE_APPLICATION_CREDENTIALS
sul percorso di un file JSON contenente le credenziali dell'account di servizio. Consulta i nostri consigli per archiviare in modo sicuro queste credenziali.Utilizza
google.oauth2.id_token.fetch_id_token(request, audience)
per recuperare un token ID.Quando verifichi questo token, il payload del token conterrà l'indirizzo email del nuovoaccount di serviziot.