Autenticazione per le chiamate (1ª generazione.)
Per richiamare una funzione Cloud Run autenticata, il principal sottostante deve soddisfare i seguenti requisiti:
- Avere l'autorizzazione per richiamare la funzione.
- Fornisci un token ID quando richiama la funzione.
Che cos'è un principale? Come descritto in Proteggere le funzioni Cloud Run, Cloud Run Functions supporta due diversi tipi di identità, chiamate anche entità:
- Service account: si tratta di account speciali che fungono da identità di una persona non fisica, ad esempio una funzione, un'applicazione o una VM. Ti offrono un modo per autenticare queste entità non umane.
- Account utente: questi account rappresentano persone, in qualità di titolari di un Account Google individuale o come parte di un'entità controllata da Google, ad esempio un gruppo Google.
Consulta la panoramica di IAM per scoprire di più sui concetti di base di IAM.
Per richiamare una funzione Cloud Run autenticata, l'entità deve disporre dell'autorizzazione IAM invoker:
cloudfunctions.functions.invoke
. Di solito questo avviene tramite il ruolo Invoker.
Per concedere queste autorizzazioni, utilizza il comando
add-invoker-policy-binding
come mostrato in
Autenticazione della funzione per le chiamate di funzioni.
Per l'autorizzazione a creare, aggiornare o eseguire altre azioni amministrative su una funzione, l'entità deve disporre di un ruolo appropriato. I ruoli includono autorizzazioni che definiscono le azioni consentite all'entità. Per saperne di più, consulta Utilizzare IAM per autorizzare l'accesso.
L'invocazione di una funzione può presentare ulteriori complessità. Le funzioni basate sugli eventi possono essere richiamate solo dall'origine eventi a cui sono iscritte, mentre 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 servizio che vuole utilizzare la funzione. Per impostazione predefinita, queste identità devono fornire un token ID con la richiesta per autenticarsi. Inoltre, all'account utilizzato devono essere 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 l'invocazione.
Esempio 1: autenticare i test degli sviluppatori
In qualità di sviluppatore, devi disporre dell'accesso per creare, aggiornare ed eliminare funzioni e questo accesso viene concesso utilizzando la normale procedura IAM.
Tuttavia, in qualità di sviluppatore, potresti dover 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 Run Functions che contenga l'autorizzazione di chiamata.
cloudfunctions.functions.invoke
. In genere, questo avviene tramite il ruolo Invoker. Per impostazione predefinita, i ruoli Amministratore funzioni Cloud Run e Sviluppatore funzioni Cloud Run dispongono di questa autorizzazione. Consulta Ruoli IAM per le funzioni Cloud Run per l'elenco completo dei ruoli e delle relative autorizzazioni.
Se lavori dalla tua macchina locale, configura l'accesso alla riga di comando inizializzando Google Cloud CLI.
Fornisci la richiesta con le credenziali di autenticazione come token ID generato da Google memorizzato in un'intestazione
Authorization
. Ad esempio, recupera 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 tua funzione. Recupera questo URL dalla pagina delle funzioni Cloud Run della consoleGoogle Cloud o eseguendo il comando
gcloud functions describe
come mostrato nel primo passaggio dell'esempio di comando di deployment di Google Cloud CLI.
Puoi utilizzare i token creati da gcloud
per richiamare le funzioni HTTP in qualsiasi
progetto, a condizione che il tuo account disponga dell'autorizzazione cloudfunctions.functions.invoke
per la funzione richiamata. A scopo di sviluppo, utilizza
token ID generati da gcloud
. Tuttavia, tieni presente che questi token non includono una rivendicazione del pubblico, il che li rende vulnerabili agli attacchi di tipo relay. Negli ambienti di produzione, utilizza i token ID emessi per un account di servizio con il pubblico appropriato specificato. Questo approccio migliora la sicurezza limitando l'utilizzo dei token
solo al servizio previsto.
Come sempre, ti consigliamo di allocare il set minimo di autorizzazioni necessarie per sviluppare e utilizzare le tue funzioni. Assicurati che i criteri IAM sulle tue funzioni siano limitati al numero minimo di utenti e service account.
Esempio 2: autenticare le chiamate da funzione a funzione
Quando crei servizi che connettono più funzioni, è consigliabile
assicurarsi che ogni funzione possa inviare richieste solo a un sottoinsieme specifico delle
altre funzioni. Ad esempio, se hai 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 di ricezione in modo che accetti le richieste da una funzione di chiamata specifica, devi concedere il ruolo di invoker appropriato al account di servizio della funzione di chiamata nella funzione di ricezione. Il ruolo
invoker è Invoker di Cloud Run Functions (roles/cloudfunctions.invoker
):
Console
Utilizza l'invoker di Cloud Run 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 un indirizzo email di un account di servizio.
Seleziona il ruolo Cloud Functions > Cloud Functions Invoker dal menu a discesa Seleziona un ruolo.
Fai clic su Salva.
gcloud
Utilizza 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 binding del criterio IAM del ruolo invoker
che consente al membro (entità) specificato di richiamare la funzione
specificata. Google Cloud CLI rileva automaticamente la generazione della funzione e
aggiunge il ruolo Invoker corretto (cloudfunctions.invoker
per1ª generazionen.).
Sostituisci quanto segue:
RECEIVING_FUNCTION
: il nome della funzione di ricezione.CALLING_FUNCTION_IDENTITY
: l'identità della funzione di chiamata, un indirizzo email del account di servizio.
Poiché richiamerà la funzione di ricezione, la funzione di chiamata deve fornire anche un token ID firmato da Google per l'autenticazione. Si tratta di una procedura in due passaggi:
Crea un token ID firmato da Google con il campo pubblico (
aud
) impostato sull'URL della funzione di ricezione.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.
Generare token ID
Questa sezione descrive i diversi modi in cui puoi generare il token ID necessario a un principal per richiamare una funzione.
È possibile l'accesso non autenticato senza un token ID, ma deve essere attivato. Per ulteriori informazioni, consulta la sezione Utilizzo di IAM per autorizzare l'accesso.
Generare token in modo programmatico
Dopo che il seguente codice genera un token ID, chiama la tua funzione Cloud Run con quel 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
Generare token manualmente
Se richiami una funzione e per qualche motivo non puoi utilizzare le librerie di autenticazione, esistono due modi per ottenere manualmente il token ID, utilizzando il server dei metadati di Compute o creando un JWT autofirmato e scambiandolo con un token ID firmato da Google.
Utilizzare il server di metadati
Puoi utilizzare il server di metadati di Compute per recuperare i token ID con un pubblico specifico come segue:
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 Autenticazione dei test per sviluppatori riportata sopra.
Scambia un JWT autofirmato con un token ID firmato da Google
Concedi il ruolo Invoker (
roles/cloudfunctions.invoker
) all'account di servizio della funzione chiamante nella funzione ricevente.Crea un service account e una chiave e scarica il file con la chiave privata (in formato JSON) sull'host da cui la funzione o il servizio chiamante effettua le richieste.
Crea un JWT con l'intestazione impostata su
{"alg":"RS256","typ":"JWT"}
. Il payload deve includere un'attestazionetarget_audience
impostata sull'URL della funzione di ricezione e le attestazioniiss
esub
impostate sull'indirizzo email dell'account di servizio utilizzato sopra. Deve includere anche le rivendicazioniexp
eiat
. La rivendicazioneaud
deve essere impostata suhttps://www.googleapis.com/oauth2/v4/token
.Utilizza 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 che hai appena creato.Restituisce un altro JWT che include un
id_token
firmato da Google.
Invia la richiesta GET/POST alla funzione di ricezione. 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 per altri modi per generare token ID.