Autenticazione tra servizi
Oltre ad autenticare le richieste degli utenti finali, ti consigliamo di autenticare i servizi (utenti non umani) che inviano richieste alla tua API. Questa pagina spiega come utilizzare gli account di servizio per fornire l'autenticazione a persone o servizi.
Panoramica
Per identificare un servizio che invia richieste alla tua API, utilizzi un account di servizio. Il servizio chiamante utilizza la chiave privata dell'account di servizio per firmare un token web JSON (JWT) sicuro e invia il JWT firmato nella richiesta all'API.
Per implementare l'autenticazione dell'account di servizio nell'API e nel servizio di chiamata:
- Creare un account di servizio e una chiave da utilizzare per il servizio chiamante.
- Aggiungi il supporto dell'autenticazione nella configurazione dell'API per il servizio API Gateway.
Aggiungi al servizio chiamante il codice che:
- Crea un JWT e lo firma con la chiave privata dell'account di servizio.
- Invia il JWT firmato in una richiesta all'API.
API Gateway verifica che le attestazioni nel JWT corrispondano a configurazione nella configurazione API prima di inoltrare la richiesta alla tua API. API Gateway non controlla le autorizzazioni Cloud Identity che hai concesso all'account di servizio.
Prerequisiti
In questa pagina si presuppone che tu abbia già:
Creazione di un account di servizio con una chiave
Devi avere un account di servizio con un file di chiave privata utilizzato dal servizio chiamante per firmare il JWT. Se più di un servizio invia richieste alla tua API, puoi creare un solo account di servizio per rappresentare tutti i servizi di chiamata. Se devi distinguere i servizi, ad esempio perché hanno autorizzazioni diverse, puoi creare un account di servizio e una chiave per ogni servizio di chiamata.
Questa sezione mostra come utilizzare la console Google Cloud e lo strumento a riga di comando gcloud
per creare l'account di servizio e il file della chiave privata e assegnare all'account di servizio il ruolo Creatore di token dell'account di servizio. Per informazioni sull'utilizzo di un'API per eseguire questa attività, consulta
Creazione e gestione degli account di servizio.
Per creare un account di servizio con una chiave:
Console Google Cloud
Crea un account di servizio:
Nella console Google Cloud, vai a Crea account di servizio.
Seleziona un progetto.
Nel campo Nome account di servizio, inserisci un nome. La console Google Cloud compila il campo ID account di servizio in base a questo nome.
(Facoltativo) Nel campo Descrizione account di servizio, inserisci una o l'audiodescrizione.
Fai clic su Crea.
Fai clic sul campo Seleziona un ruolo.
In Tutti i ruoli, seleziona Account di servizio > Account di servizio Creatore di token.
Fai clic su Continua.
Fai clic su Fine per completare la creazione dell'account di servizio.
Non chiudere la finestra del browser. Lo utilizzerai nella procedura successiva.
Crea una chiave dell'account di servizio:
- Nella console Google Cloud, fai clic sull'indirizzo email del servizio che hai creato.
- Fai clic su Chiavi.
- Fai clic su Aggiungi chiave, quindi su Crea nuova chiave.
- Fai clic su Crea. Sul computer viene scaricato un file della chiave JSON.
- Fai clic su Chiudi.
gcloud
Puoi eseguire i comandi seguenti utilizzando Google Cloud CLI sul tuo server o all'interno di Cloud Shell.
Imposta l'account predefinito per
gcloud
. Se hai più di un account, assicurati di scegliere l'account incluso nel progetto Google Cloud che vuoi utilizzare.gcloud auth login
Mostra gli ID progetto per i tuoi progetti Google Cloud.
gcloud projects list
Imposta il progetto predefinito. Sostituisci
PROJECT_ID
con l'ID progetto Google Cloud che vuoi utilizzare.gcloud config set project PROJECT_ID
Crea un account di servizio. Sostituisci
SA_NAME
eSA_DISPLAY_NAME
con il nome e il nome visualizzato che vuoi utilizzare.gcloud iam service-accounts create SA_NAME \ --display-name "SA_DISPLAY_NAME"
Viene visualizzato l'indirizzo email dell'account di servizio appena creato.
gcloud iam service-accounts list
Aggiungi il ruolo Creatore token account di servizio. Sostituisci
SA_EMAIL_ADDRESS
con il nome dell'account di servizio .gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:SA_EMAIL_ADDRESS \ --role roles/iam.serviceAccountTokenCreator
Crea un file della chiave dell'account di servizio nella directory di lavoro attuale. Sostituisci
FILE_NAME
con il nome che vuoi utilizzare per il file della chiave. Per impostazione predefinita, il comandogcloud
crea un file JSON.gcloud iam service-accounts keys create FILE_NAME.json \ --iam-account SA_EMAIL_ADDRESS
Consulta le
Riferimento gcloud
per ulteriori informazioni sui comandi precedenti.
Per informazioni sulla protezione della chiave privata, consulta Best practice per la gestione delle credenziali.
Configurare l'API per supportare l'autenticazione
Quando crei una configurazione API per il gateway, devi specificare un account di servizio che il gateway utilizza per interagire con altri servizi. Per attivare l'autenticazione dell'account di servizio per i servizi che chiamano il gateway, modifica l'oggetto requisito di sicurezza e l'oggetto definizioni di sicurezza nella configurazione dell'API. Se segui i passaggi riportati di seguito, API Gateway potrà convalidare i claim nel JWT firmato utilizzato dai servizi chiamanti.
Aggiungi l'account di servizio come emittente nella configurazione API.
securityDefinitions: DEFINITION_NAME: authorizationUrl: "" flow: "implicit" type: "oauth2" x-google-issuer: "SA_EMAIL_ADDRESS" x-google-jwks_uri: "https://www.googleapis.com/robot/v1/metadata/x509/SA_EMAIL_ADDRESS"
- Sostituisci
DEFINITION_NAME
con una stringa che identifica questa definizione di sicurezza. Ti consigliamo di sostituirlo nome dell'account di servizio o un nome che identifica il servizio chiamante. - Sostituisci
SA_EMAIL_ADDRESS
con il servizio all'indirizzo email dell'account. - Puoi definire più definizioni di sicurezza nella configurazione API, ma
ogni definizione deve avere un valore
x-google-issuer
diverso. Se hai creato account di servizio separati per ogni servizio di chiamata, puoi creare una definizione di sicurezza per ogni account di servizio, ad esempio:
securityDefinitions: service-1: authorizationUrl: "" flow: "implicit" type: "oauth2" x-google-issuer: "service-1@example-project-12345.iam.gserviceaccount.com" x-google-jwks_uri: "https://www.googleapis.com/robot/v1/metadata/x509/service-1@example-project-12345.iam.gserviceaccount.com" service-2: authorizationUrl: "" flow: "implicit" type: "oauth2" x-google-issuer: "service-2@example-project-12345.iam.gserviceaccount.com" x-google-jwks_uri: "https://www.googleapis.com/robot/v1/metadata/x509/service-2@example-project-12345.iam.gserviceaccount.com"
- Sostituisci
Se vuoi, aggiungi
x-google-audiences
alla sezionesecurityDefinitions
. Se non aggiungix-google-audiences
, API Gateway richiede che L'affermazione"aud"
(pubblico) nel JWT è nel formatohttps://SERVICE_NAME
, dove SERVICE_NAME è il nome del tuo API Gateway configurato nel campohost
della pagina OpenAPI documento.Aggiungi una sezione
security
a livello di primo livello del file (non rientrata o nidificata) per applicarla all'intera API o a livello di metodo per applicarla a un metodo specifico. Se utilizzi sezionisecurity
sia nell'API e, a livello di metodo, le impostazioni a livello di metodo Impostazioni a livello di API.security: - DEFINITION_NAME: []
- Sostituisci
DEFINITION_NAME
con il nome utilizzato nella sezionesecurityDefinitions
. Se hai più di una definizione nella sezione
securityDefinitions
, aggiungile nella sezionesecurity
, ad esempio:security: - service-1: [] - service-2: []
- Sostituisci
Esegui il deployment della configurazione API aggiornata.
Prima che API Gateway inoltri una richiesta alla tua API, API Gateway verifica:
- La firma del JWT mediante la chiave pubblica, che si trova nell'URI
specificato nel campo
x-google-jwks_uri
della configurazione API. - Che l'affermazione
"iss"
(issuer) nel JWT corrisponda al valore specificato nelx-google-issuer
campo. - Che la dichiarazione
"aud"
(pubblico) nel JWT contenga i tuoi il nome del servizio API Gateway o corrisponde a uno dei valori che specificato nel campox-google-audiences
. - Che il token non sia scaduto utilizzando l'affermazione
"exp"
(data e ora di scadenza).
Per ulteriori informazioni su x-google-issuer
, x-google-jwks_uri
e
x-google-audiences
, vedi Estensioni OpenAPI.
Invio di una richiesta autenticata a un'API API Gateway
Per effettuare una richiesta autenticata, il servizio chiamante invia un JWT firmato dall'account di servizio specificato nella configurazione dell'API. Il servizio di chiamata devono:
- Crea un JWT e firmalo con la chiave privata dell'account di servizio.
- Invia il JWT firmato in una richiesta all'API.
Il codice campione seguente mostra questo processo per alcuni linguaggi. Per effettuare una richiesta autenticata in altre lingue, fai riferimento jwt.io per un elenco delle librerie supportate.
-
Nel servizio chiamante, aggiungi la seguente funzione e passa i seguenti parametri:
Java -
saKeyfile
: il percorso completo della chiave privata dell'account di servizio . -
saEmail
: l'indirizzo email dell'account di servizio. -
audience
: se hai aggiunto il campox-google-audiences
alla configurazione dell'API, impostaaudience
su uno dei valori specificati perx-google-audiences
. Altrimenti, imposta Daaudience
ahttps://SERVICE_NAME
, doveSERVICE_NAME
è il tuo gateway API il nome del servizio. -
expiryLength
: la data di scadenza del JWT, in secondi.
Python -
sa_keyfile
: il percorso completo della chiave privata dell'account di servizio . -
sa_email
: l'indirizzo email dell'account di servizio. -
audience
: se hai aggiunto il campox-google-audiences
alla configurazione dell'API, impostaaudience
su uno dei valori che che hai specificato perx-google-audiences
. In caso contrario, impostaaudience
suhttps://SERVICE_NAME
, doveSERVICE_NAME
è il nome del servizio API Gateway. -
expiry_length
: la data di scadenza del JWT, in secondi.
Vai -
saKeyfile
: il percorso completo del file della chiave privata dell'account di servizio. -
saEmail
: l'indirizzo email dell'account di servizio. -
audience
: se hai aggiunto il campox-google-audiences
alla configurazione dell'API, impostaaudience
su uno dei valori che che hai specificato perx-google-audiences
. In caso contrario, impostaaudience
suhttps://SERVICE_NAME
, doveSERVICE_NAME
è il nome del servizio API Gateway. -
expiryLength
: la scadenza del JWT, espressa in secondi.
La funzione crea un JWT, lo firma utilizzando il file della chiave privata e restituisce il JWT firmato.
Java Python Vai -
-
Nel servizio chiamante, aggiungi la funzione seguente per inviare il JWT firmato
nell'intestazione
Authorization: Bearer
nella richiesta all'API:Java Python Vai
Per motivi di sicurezza, quando invii una richiesta utilizzando un JWT,
ti consigliamo di inserire il token di autenticazione nella sezione Authorization: Bearer
intestazione. Ad esempio:
curl --request POST \ --header "Authorization: Bearer ${TOKEN}" \ "${GATEWAY_URL}/echo"
dove GATEWAY_URL
e TOKEN
sono variabili di ambiente contenenti rispettivamente l'URL del gateway di cui è stato eseguito il deployment e il token di autenticazione.
Ricezione di risultati autenticati nell'API
In genere, API Gateway inoltra tutte le intestazioni che riceve. Tuttavia, sostituisce l'intestazione Authorization
originale quando l'indirizzo del backend è specificato da x-google-backend
nella configurazione dell'API.
API Gateway invierà il risultato dell'autenticazione in X-Apigateway-Api-Userinfo
all'API di backend. Ti consigliamo di utilizzare questa intestazione anziché l'originale
Intestazione Authorization
. Questa intestazione è codificata in base64url
e contiene
il payload JWT.