Autenticazione per la chiamata
Per richiamare una Cloud Function autenticata, l'entità sottostante deve soddisfare i seguenti requisiti:
- Disporre dell'autorizzazione per richiamare la funzione.
- Fornisci un token ID quando richiama la funzione.
Che cos'è un'entità? Come descritto in Proteggere le tue funzioni Cloud Functions, Cloud Functions supporta due diversi tipi di identità, chiamati anche principal:
- Account di servizio: sono account speciali che fungono da identità di una persona, ad esempio una funzione, un'applicazione o una VM. Ti offrono un modo per autenticare queste non persone.
- Account utente: questi account rappresentano persone, in qualità di singoli proprietari di Account Google o facenti parte di un'entità controllata da Google come un gruppo Google.
Consulta la panoramica di IAM per scoprire di più sui concetti IAM di base.
Per richiamare una Cloud Function autenticata, l'entità deve avere l'autorizzazione IAM richiamar:
cloudfunctions.functions.invoke
per le funzioni di 1ª generazione. In genere questo avviene tramite il ruolo Invoker di Cloud Functions.run.routes.invoke
per le funzioni di 2ª generazione. In genere questo avviene tramite il ruolo Invoker di Cloud Run. Questa autorizzazione deve essere assegnata per la risorsa del servizio Cloud Run.
Per concedere queste autorizzazioni, utilizza il comando add-invoker-policy-binding
, come mostrato in Autenticare la funzione per le chiamate di funzione.
Per l'autorizzazione per creare, aggiornare o eseguire altre azioni amministrative su una funzione, l'entità deve avere un ruolo appropriato. I ruoli includono le autorizzazioni che definiscono le azioni che l'entità è autorizzata a eseguire. Per saperne di più, consulta Utilizzo di IAM per autorizzare l'accesso.
Richiamare una funzione può avere ulteriori complessità. Le funzioni basate su eventi possono essere richiamate solo dall'origine evento a cui sono sottoscritte, ma le funzioni HTTP possono essere richiamate da diversi tipi di identità, provenienti da luoghi diversi. L'invoker potrebbe essere uno sviluppatore che sta testando la funzione o un'altra funzione o un altro servizio che vuole utilizzare la funzione. Per impostazione predefinita, queste identità devono fornire un token ID con la richiesta di autenticazione. Inoltre, è necessario che all'account utilizzato siano state concesse le autorizzazioni appropriate.
Scopri di più su come generare e utilizzare i token ID.
Esempi di autenticazione
Questa sezione mostra alcuni esempi diversi di autenticazione per le chiamate.
Esempio 1: autenticare i test degli sviluppatori
In qualità di sviluppatore, devi disporre dell'accesso per creare, aggiornare ed eliminare le funzioni e questa operazione viene concessa utilizzando il processo (IAM) normale.
Tuttavia, in qualità di sviluppatore, potrebbe essere necessario richiamare le tue funzioni a scopo di test. Per richiamare una funzione utilizzando curl
o strumenti simili, tieni presente quanto segue:
Assegna un ruolo al tuo account utente Cloud Functions contenente l'autorizzazione di chiamata.
cloudfunctions.functions.invoke
per le funzioni di 1ª generazione. In genere questo avviene tramite il ruolo Invoker di Cloud Functions. Per impostazione predefinita, i ruoli Amministratore Cloud Functions e Sviluppatore Cloud Functions dispongono di questa autorizzazione. Consulta Ruoli IAM di Cloud Functions per l'elenco completo dei ruoli e delle autorizzazioni associate.run.routes.invoke
per le funzioni di 2ª generazione. In genere questo avviene tramite il ruolo Invoker di Cloud Run.
Se lavori dalla tua macchina locale, configura l'accesso da riga di comando inizializzando Google Cloud CLI.
Fornisci alla richiesta le credenziali di autenticazione come token ID generato da Google e memorizzato in un'intestazione
Authorization
. Ad esempio, puoi ottenere un token ID utilizzandogcloud
eseguendo questo comando:curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ https://FUNCTION_URL
dove FUNCTION_URL è l'URL della funzione. Recupera questo URL dalla pagina Cloud Functions della console Google Cloud o eseguendo il comando
gcloud functions describe
come mostrato nel primo passaggio dell'esempio del comando di deployment di Google Cloud CLI.
Puoi utilizzare i token creati da gcloud
per richiamare le funzioni HTTP in qualsiasi progetto purché il tuo account disponga dell'autorizzazione cloudfunctions.functions.invoke
per la funzione che viene richiamata. A scopo di sviluppo, utilizza
i token ID generati da gcloud
. Tuttavia, tieni presente che questi token non hanno una
rivendicazione del pubblico, il che li rende suscettibili di attacchi di inoltro. Negli ambienti di produzione, utilizza i token ID emessi per un account di servizio con il segmento di pubblico appropriato specificato. Questo approccio migliora la sicurezza limitando l'utilizzo dei token al solo servizio previsto.
Come sempre, ti consigliamo di allocare l'insieme minimo di autorizzazioni necessario per sviluppare e utilizzare le tue funzioni. Assicurati che i criteri IAM delle funzioni siano limitati al numero minimo di utenti e account di servizio.
Esempio 2: autenticare una funzione per effettuare chiamate di funzione
Quando si creano servizi che collegano più funzioni, è buona norma
assicurarsi che ogni funzione possa inviare richieste solo a un sottoinsieme specifico
delle altre funzioni. Ad esempio, se disponi di una funzione login
, dovrebbe essere in grado di accedere alla funzione user profiles
, ma probabilmente non dovrebbe essere in grado di accedere alla funzione search
.
Per configurare la funzione ricevente in modo che accetti le richieste da una specifica funzione di chiamata, devi concedere il ruolo richiamar appropriato all'account di servizio della funzione chiamante sulla funzione ricevente. Per le funzioni di 1ª generazione, il ruolo invoker è Invoker di Cloud Functions (roles/cloudfunctions.invoker
).
Per le funzioni di 2ª generazione, il ruolo Invoker è Cloud Run Invoker
(roles/run.invoker
) e deve essere concesso
nel servizio sottostante.
Cloud Functions (1ª generazione.):
Console
Per le funzioni di 1ª generazione, utilizza l'invoker di Cloud Functions:
Vai alla console Google Cloud:
Fai clic sulla casella di controllo accanto alla funzione di ricezione. Non fare clic sulla funzione stessa.
Fai clic su Autorizzazioni nella parte superiore dello schermo. Si apre il riquadro Autorizzazioni.
Fai clic su Aggiungi entità.
Nel campo Nuove entità, inserisci l'identità della funzione chiamante. Deve essere l'indirizzo email di un account di servizio.
Seleziona il ruolo Cloud Functions > Invoker di Cloud Functions dal menu a discesa Seleziona un ruolo.
Fai clic su Salva.
gcloud
Usa il comando gcloud functions add-invoker-policy-binding
:
gcloud functions add-invoker-policy-binding RECEIVING_FUNCTION \ --member='serviceAccount:CALLING_FUNCTION_IDENTITY'
Il comando add-invoker-policy-binding
aggiunge un'associazione di criteri IAM con il ruolo di callback che consente al membro specificato (entità) di richiamare la funzione specificata. Google Cloud CLI rileva automaticamente la generazione della funzione e aggiunge il ruolo Invoker corretto (cloudfunctions.invoker
per 1ª generazione e run.invoker
per la 2ª generazione).
Sostituisci quanto segue:
RECEIVING_FUNCTION
: il nome della funzione di ricezione.CALLING_FUNCTION_IDENTITY
: l'identità della funzione di chiamata, l'indirizzo email di un account di servizio.
Cloud Functions (2nd gen):
Console
Per le funzioni di 2ª generazione, utilizza Invoker di Cloud Run:
Vai alla console Google Cloud:
Nell'elenco dei servizi Cloud Run, fai clic sulla casella di controllo accanto alla funzione di ricezione. Non fare clic sulla funzione in sé.
Si apre il riquadro Autorizzazioni.
Fai clic su Aggiungi entità.
Inserisci l'identità del servizio chiamante. Di solito è un indirizzo email, per impostazione predefinita
PROJECT_NUMBER-compute@developer.gserviceaccount.com
.Tieni presente che il numero del progetto è diverso dall'ID e dal nome del progetto. Puoi trovare il numero del tuo progetto nella pagina Dashboard della console Google Cloud.
Seleziona il ruolo
Cloud Run Invoker
dal menu a discesa Seleziona un ruolo.Fai clic su Salva.
gcloud
Usa il comando gcloud functions add-invoker-policy-binding
:
gcloud functions add-invoker-policy-binding RECEIVING_FUNCTION \ --member='serviceAccount:CALLING_FUNCTION_IDENTITY'
Il comando add-invoker-policy-binding
aggiunge un'associazione di criteri IAM con il ruolo di callback che consente al membro specificato (entità) di richiamare la funzione specificata. Google Cloud CLI rileva automaticamente la generazione della funzione e aggiunge il ruolo Invoker corretto (cloudfunctions.invoker
per 1ª generazione e run.invoker
per la 2ª generazione).
Sostituisci quanto segue:
RECEIVING_FUNCTION
: il nome della funzione di ricezione.CALLING_FUNCTION_IDENTITY
: l'identità della funzione di chiamata, l'indirizzo email di un account di servizio.
Poiché richiamerà la funzione ricevente, la funzione di chiamata deve fornire anche un token ID firmato da Google per l'autenticazione. Si tratta di una procedura in due fasi:
Crea un token ID firmato da Google con il campo per il pubblico (
aud
) impostato sull'URL della funzione ricevente.Includi il token ID in un'intestazione
Authorization: Bearer ID_TOKEN
nella richiesta alla funzione.
Il modo di gran lunga più semplice e affidabile per gestire questo processo è utilizzare le librerie di autenticazione, come mostrato di seguito, per generare e utilizzare questo token.
Genera token ID
Questa sezione descrive i diversi modi in cui puoi generare il token ID necessario a un'entità per richiamare una funzione.
L'accesso non autenticato senza un token ID è possibile, ma deve essere abilitato. Per ulteriori informazioni, consulta Utilizzo di IAM per autorizzare l'accesso.
Genera i token in modo programmatico
Dopo che il codice seguente ha generato un token ID, chiama la funzione Cloud Function con questo token per tuo conto. Questo codice funziona in qualsiasi ambiente in cui le librerie possono ottenere le credenziali di autenticazione, inclusi gli ambienti che supportano le credenziali predefinite dell'applicazione locali.
Node.js
Python
Go
Java
Genera i token manualmente
Se richiami una funzione e per qualche motivo non puoi utilizzare le librerie di autenticazione, esistono due modi per ottenere il token ID manualmente: utilizzando il server di metadati Compute o creando un JWT autofirmato e scambiandolo con un token ID firmato da Google.
Utilizzare il server dei metadati
Puoi utilizzare il server di metadati Compute per recuperare i token ID con un segmento di pubblico specifico, come descritto di seguito:
curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=AUDIENCE" \
-H "Metadata-Flavor: Google"
Sostituisci AUDIENCE con l'URL della funzione che stai richiamando. Puoi recuperare questo URL come descritto nella sezione Test per l'autenticazione degli sviluppatori riportata sopra.
Scambia un JWT autofirmato con un token ID firmato da Google
Concedi il ruolo Invoker di Cloud Functions (
roles/cloudfunctions.invoker
) all'account di servizio della funzione chiamante sulla funzione ricevente.Crea un account di servizio e una chiave e scarica il file con la chiave privata (in formato JSON) nell'host da cui la funzione o il servizio chiamante effettua le proprie richieste.
Crea un JWT con l'intestazione impostata su
{"alg":"RS256","typ":"JWT"}
. Il payload dovrebbe includere un'attestazionetarget_audience
impostata sull'URL della funzione ricevente e le attestazioniiss
esub
impostate sull'indirizzo email dell'account di servizio utilizzato in precedenza. Deve includere anche le rivendicazioniexp
eiat
. La dichiarazioneaud
deve essere impostata suhttps://www.googleapis.com/oauth2/v4/token
.Usa la chiave privata scaricata sopra per firmare il JWT.
Utilizzando questo JWT, invia una richiesta POST a https://www.googleapis.com/oauth2/v4/token. I dati di autenticazione devono essere inclusi nell'intestazione e nel corpo della richiesta.
Nell'intestazione:
Authorization: Bearer $JWT - where $JWT is the JWT you just created Content-Type: application/x-www-form-urlencoded
Nel corpo:
grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=$JWT
Sostituisci
$JWT
con il JWT appena creatoQuesto restituisce un altro JWT che include un
id_token
firmato da Google.
Invia la richiesta GET/POST alla funzione ricevente. Includi il token ID firmato da Google in un'intestazione Authorization: Bearer ID_TOKEN_JWT
nella richiesta.
Passaggi successivi
Scopri come gestire l'accesso alle funzioni.
Ricevi assistenza su altri modi per generare token ID.