Autenticazione tra servizi
Oltre ad autenticare le richieste degli utenti finali, potresti voler autenticare i servizi (utenti non umani) che effettuano richieste alla tua API. Questa pagina spiega come utilizzare i service account per fornire l'autenticazione per persone o servizi.
Panoramica
Per identificare un servizio che invia richieste alla tua API, utilizza un service account. Il servizio chiamante utilizza la chiave privata dell'account di servizio per firmare un JSON Web Token (JWT) sicuro e invia il JWT firmato nella richiesta alla tua API.
Per implementare l'autenticazione del account di servizio nel tuo servizio di chiamata e API:
- Crea un account di servizio e una chiave da utilizzare per il servizio di chiamata.
- Aggiungi il supporto per l'autenticazione nella configurazione API per il tuo servizio API Gateway.
Aggiungi al servizio di chiamate un codice che:
- Crea un JWT e lo firma con la chiave privata del account di servizio.
- Invia il JWT firmato in una richiesta all'API.
API Gateway verifica che le rivendicazioni nel JWT corrispondano alla configurazione nella configurazione API prima di inoltrare la richiesta all'API. API Gateway non verifica le autorizzazioni Cloud Identity che hai concesso al account di servizio.
Prerequisiti
Questa pagina presuppone che tu abbia già:
Crea un account di servizio con una chiave
Hai bisogno di un account di servizio con un file di chiave privata che il servizio chiamante utilizza per firmare il JWT. Se hai più di un servizio che invia richieste alla tua API, puoi creare un account di servizio per rappresentare tutti i servizi chiamanti. Se devi distinguere i servizi, ad esempio perché potrebbero avere 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 il account di servizio e il file della chiave privata e per assegnare al account di servizio il ruolo Creatore token service account. Per informazioni sull'utilizzo di un'API per eseguire questa attività, vedi
Creazione e gestione dei service account.
Per creare un account di servizio con una chiave:
Console Google Cloud
Crea un service account:
Nella console Google Cloud , vai a Crea service account.
Seleziona un progetto.
Nel campo Nome service account, inserisci un nome. La consoleGoogle Cloud compila il campo ID service account in base a questo nome.
(Facoltativo) Nel campo Descrizione service account, inserisci una descrizione.
Fai clic su Crea.
Fai clic sul campo Seleziona un ruolo.
Nella sezione Tutti i ruoli, seleziona Account di servizio > Creatore token account di servizio.
Fai clic su Continua.
Fai clic su Fine per completare la creazione del service account.
Non chiudere la finestra del browser. Lo utilizzerai nella prossima procedura.
Crea una chiave dell'account di servizio:
- Nella console Google Cloud , fai clic sull'indirizzo email del service account che hai creato.
- Fai clic su Chiavi.
- Fai clic su Aggiungi chiave, poi su Crea nuova chiave.
- Fai clic su Crea. Un file della chiave JSON viene scaricato sul computer.
- Fai clic su Chiudi.
gcloud
Puoi eseguire i seguenti comandi utilizzando Google Cloud CLI sulla tua macchina locale o in Cloud Shell.
Imposta l'account predefinito per
gcloud. Se hai più di un account, assicurati di scegliere l'account che si trova nel Google Cloud progetto che vuoi utilizzare.gcloud auth login
Visualizza gli ID progetto per i tuoi progetti Google Cloud .
gcloud projects list
Imposta il progetto predefinito. Sostituisci
PROJECT_IDcon l'ID progetto Google Cloud che vuoi utilizzare.gcloud config set project PROJECT_ID
Crea un account di servizio. Sostituisci
SA_NAMEeSA_DISPLAY_NAMEcon il nome e il nome visualizzato che vuoi utilizzare.gcloud iam service-accounts create SA_NAME \ --display-name "SA_DISPLAY_NAME"
Visualizza l'indirizzo email del account di servizio che hai appena creato.
gcloud iam service-accounts list
Aggiungi il ruolo Creatore token service account. Sostituisci
SA_EMAIL_ADDRESScon l'indirizzo email deaccount di serviziont.gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:SA_EMAIL_ADDRESS \ --role roles/iam.serviceAccountTokenCreator
Crea un file della chiave del account di servizio nella directory di lavoro corrente. Sostituisci
FILE_NAMEcon il nome che vuoi utilizzare per il file della chiave. Per impostazione predefinita, il comandogcloudcrea un file JSON.gcloud iam service-accounts keys create FILE_NAME.json \ --iam-account SA_EMAIL_ADDRESS
Per ulteriori informazioni sui comandi precedenti, consulta il riferimento a gcloud.
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, specifichi un account di servizio che il gateway utilizza per interagire con altri servizi. Per abilitare l'autenticazione dell'account di servizio per i servizi che chiamano il gateway, modifica gli oggetti di sicurezza nella configurazione API. Le modifiche variano in base alla versione della specifica OpenAPI utilizzata.
Per configurare API Gateway in modo che convalidi le rivendicazioni nel JWT firmato utilizzato dai servizi chiamanti:
OpenAPI 2.0
- 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_NAMEcon una stringa che identifica questa definizione di sicurezza. Ti consigliamo di sostituirlo con il nomeaccount di serviziot o un nome che identifichi il servizio chiamante. - Sostituisci
SA_EMAIL_ADDRESScon l'indirizzo email del service account. - Puoi definire più definizioni di sicurezza nella configurazione API, ma
ogni definizione deve avere un
x-google-issuerdiverso. Se hai creato service account 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
- (Facoltativo) Aggiungi
x-google-audiencesalla sezionesecurityDefinitions. Se non aggiungix-google-audiences, API Gateway richiede che l'attestazione"aud"(pubblico) nel JWT sia nel formatohttps://SERVICE_NAME, dove SERVICE_NAME è il nome del servizio API Gateway che hai configurato nel campohostdel documento OpenAPI. - Aggiungi una sezione
securityal primo livello del file (non rientrata o nidificata) da applicare all'intera API o a livello di metodo da applicare a un metodo specifico. Se utilizzi le sezionisecuritysia a livello di API sia a livello di metodo, le impostazioni a livello di metodo sostituiscono quelle a livello di API.security: - DEFINITION_NAME: []
- Sostituisci
DEFINITION_NAMEcon il nome che hai 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, verifica:
- La firma del JWT utilizzando la chiave pubblica, che si trova nell'URI
specificato nel campo
x-google-jwks_uridella configurazione API. - L'attestazione
"iss"(emittente) nel JWT corrisponda al valore specificato nel campox-google-issuer. - Che l'attestazione
"aud"(pubblico) nel JWT contenga il nome del servizio API Gateway o corrisponda a uno dei valori specificati nel campox-google-audiences. - Che il token non sia scaduto utilizzando l'attestazione
"exp"(ora di scadenza).
- La firma del JWT utilizzando la chiave pubblica, che si trova nell'URI
specificato nel campo
OpenAPI 3.x
- Aggiungi l'account di servizio come emittente nella configurazione API:
components: securitySchemes: SCHEME_NAME: type: oauth2 flows: implicit: authorizationUrl: "" scopes: {} x-google-auth: issuer: SA_EMAIL_ADDRESS jwksUri: https://www.googleapis.com/robot/v1/metadata/x509/SA_EMAIL_ADDRESS security: - SCHEME_NAME: []
- Sostituisci
SCHEME_NAMEcon una stringa che identifica questo schema di sicurezza. Ti consigliamo di sostituirlo con il nomeaccount di serviziot o un nome che identifichi il servizio chiamante. - Sostituisci
SA_EMAIL_ADDRESScon l'indirizzo email del service account. - Puoi definire più schemi di sicurezza nella configurazione API, ma
ogni definizione deve avere un
issuerdiverso. Se hai creato service account separati per ogni servizio di chiamata, puoi creare una definizione di sicurezza per ogni account di servizio, ad esempio:components: securitySchemes: service-1: type: oauth2 flows: implicit: authorizationUrl: "" scopes: {} x-google-auth: issuer: "service-1@example-project-12345.iam.gserviceaccount.com" jwksUri: https://www.googleapis.com/robot/v1/metadata/x509/service-1@example-project-12345.iam.gserviceaccount.com jwtLocations: - header: Authorization valuePrefix: "Bearer " service-2: type: oauth2 flows: implicit: authorizationUrl: "" scopes: {} x-google-auth: issuer: "service-2@example-project-12345.iam.gserviceaccount.com" jwksUri: "https://www.googleapis.com/robot/v1/metadata/x509/service-2@example-project-12345.iam.gserviceaccount.com"
- Sostituisci
- (Facoltativo) Aggiungi
audiencesalla sezionesecuritySchemes. Se non aggiungiaudiences, API Gateway richiede che l'attestazione"aud"(pubblico) nel JWT sia nel formatohttps://SERVICE_NAME, dove SERVICE_NAME è il nome del servizio API Gateway che hai configurato nel camposervers.urldel documento OpenAPI. - Aggiungi una sezione
securityal primo livello del file (non rientrata o nidificata) da applicare all'intera API o a livello di metodo da applicare a un metodo specifico. Se utilizzi le sezionisecuritysia a livello di API sia a livello di metodo, le impostazioni a livello di metodo sostituiscono quelle a livello di API.security: - SCHEME_NAME: []
- Sostituisci SCHEME_NAME con il nome che hai
utilizzato nella sezione
securitySchemes. - Se hai più di una definizione nella sezione
securitySchemes, aggiungile nella sezionesecurity, ad esempio:security: - service-1: [] - service-2: []
- Sostituisci SCHEME_NAME con il nome che hai
utilizzato nella sezione
- Esegui il deployment della configurazione API aggiornata. Prima che API Gateway inoltri una richiesta alla tua API, verifica:
- La firma del JWT utilizzando la chiave pubblica, che si trova nell'URI
specificato nel campo
jwksUridella configurazione API. - L'attestazione
"iss"(emittente) nel JWT corrisponda al valore specificato nel campoissuer. - Che l'attestazione
"aud"(pubblico) nel JWT contenga il nome del servizio API Gateway o corrisponda a uno dei valori specificati nel campoaudiences. - Che il token non sia scaduto utilizzando l'attestazione
"exp"(ora di scadenza).
- La firma del JWT utilizzando la chiave pubblica, che si trova nell'URI
specificato nel campo
Effettuare una richiesta autenticata a un'API API Gateway
Per effettuare una richiesta autenticata, il servizio chiamante invia un JWT firmato dal account di servizio specificato nella configurazione dell'API. Il servizio di chiamata deve:
- Crea un JWT e firmalo con la chiave privata del account di servizio.
- Invia il JWT firmato in una richiesta all'API.
Il seguente codice campione mostra questo processo per alcune lingue. Per effettuare una richiesta autenticata in altre lingue, consulta jwt.io per un elenco delle librerie supportate.
-
Nel servizio chiamante, aggiungi la seguente funzione e trasmetti i seguenti
parametri:
Java -
saKeyfile: il percorso completo del file della chiave privata del account di servizio. -
saEmail: l'indirizzo email del account di servizio. -
audience: se hai aggiunto il campox-google-audiencesalla configurazione dell'API, impostaaudiencesu uno dei valori specificati perx-google-audiences. In caso contrario, impostaaudiencesuhttps://SERVICE_NAME, doveSERVICE_NAMEè il nome del servizio API Gateway. -
expiryLength: il tempo di scadenza del JWT, in secondi.
Python -
sa_keyfile: il percorso completo del file della chiave privata del account di servizio. -
sa_email: l'indirizzo email del account di servizio. -
audience: se hai aggiunto il campox-google-audiencesalla configurazione dell'API, impostaaudiencesu uno dei valori specificati perx-google-audiences. In caso contrario, impostaaudiencesuhttps://SERVICE_NAME, doveSERVICE_NAMEè il nome del servizio API Gateway. -
expiry_length: il tempo di scadenza del JWT, in secondi.
Vai -
saKeyfile: il percorso completo del file della chiave privata del account di servizio. -
saEmail: l'indirizzo email del account di servizio. -
audience: se hai aggiunto il campox-google-audiencesalla configurazione dell'API, impostaaudiencesu uno dei valori specificati perx-google-audiences. In caso contrario, impostaaudiencesuhttps://SERVICE_NAME, doveSERVICE_NAMEè il nome del servizio API Gateway. -
expiryLength: il tempo di scadenza del JWT, 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 seguente funzione per inviare il JWT firmato
nell'intestazione
Authorization: Bearernella richiesta all'API:Java Python Vai
Quando invii una richiesta utilizzando un JWT, per motivi di sicurezza ti
consigliamo di inserire il token di autenticazione nell'intestazione Authorization: Bearer. Ad esempio:
curl --request POST \ --header "Authorization: Bearer TOKEN" \ "GATEWAY_URL/hello"
Qui, GATEWAY_URL e TOKEN devono essere sostituiti rispettivamente con l'URL del gateway di cui è stato eseguito il deployment e il token di autenticazione.
Ricevere risultati autenticati nell'API
API Gateway in genere inoltra tutte le intestazioni che riceve. Tuttavia, esegue l'override dell'intestazione Authorization originale quando l'indirizzo backend è specificato da x-google-backend nella configurazione 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'intestazione
Authorization originale. Questa intestazione è codificata in base64url e contiene
il payload JWT.