Puoi implementare l'autenticazione tra i servizi utilizzando un account di servizio in da un servizio gRPC. Questa pagina illustra l'autenticazione da servizio a servizio tramite che illustra un esempio completo, spiegando come configurare Extensible Service Proxy (ESP) in un servizio gRPC per supportare le richieste autenticate e per chiamare il servizio da un client gRPC.
Affinché qualsiasi servizio effettui chiamate autenticate in Cloud Endpoints
API, il servizio chiamante deve avere un
account di servizio
e deve inviare un token di autenticazione nella chiamata. Il chiamante deve utilizzare un
Token ID Google
o un modello personalizzato
JSON Web Token (JWT) firmato solo
dall'account di servizio del chiamante. ESP verifica che
L'attestazione iss
nel JWT corrisponde all'impostazione issuer
nel servizio
configurazione. ESP non controlla le autorizzazioni di Identity and Access Management che sono state concesse all'account di servizio.
Nel nostro esempio, configuri e utilizzi la forma più semplice di Service-to-Service dell'autenticazione, in cui il client utilizza il proprio account di servizio Google Cloud per per generare JWT di autenticazione. L'approccio per altri metodi di autenticazione è simile, anche se la procedura lato client per ottenere token di autenticazione validi dipende dal metodo di autenticazione utilizzato.
Prima di iniziare
Questa guida si basa sull'esempio della libreria utilizzato nelle nostre Tutorial.
Clona il repository Git in cui è ospitato il codice di esempio gRPC:
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
Cambia la directory di lavoro:
cd python-docs-samples/endpoints/bookstore-grpc/
Segui le istruzioni riportate nei tutorial per configurare un progetto, se non ne hai già uno.
In questo esempio, utilizzi il deployment in Google Kubernetes Engine, anche se la configurazione di autenticazione è la stessa di Compute Engine.
Nell'esempio, vengono fatti riferimento a due progetti Google Cloud:
- Il progetto di producer di servizi, ovvero il progetto proprietario del servizio Cloud Endpoints per gRPC.
- Il progetto consumer del servizio, ovvero il progetto proprietario del client gRPC.
Creazione dell'account di servizio consumer e della chiave
Per creare l'account di servizio e la chiave per il progetto consumer:
- Nella console Google Cloud, vai ad API e i servizi di machine learning. Assicurati di essere nel tuo progetto consumer.
- Nella pagina Credenziali, nell'elenco a discesa Crea credenziali, Seleziona Service Account Key (Chiave account di servizio).
Nella pagina Crea chiave account di servizio, se disponi di un servizio esistente che vuoi utilizzare, selezionalo. Altrimenti, nel Nell'elenco a discesa Account di servizio, seleziona Nuovo account di servizio e digita un nome account.
Viene creato un ID account di servizio corrispondente. Prendi nota ID, poiché è necessario nelle sezioni seguenti. Ad esempio:
service-account-name@YOUR_PROJECT_ID.iam.gserviceaccount.com
Fai clic sull'elenco a discesa Ruolo e seleziona i ruoli seguenti:
- Account di servizio > Utente account di servizio
- Account di servizio > Creatore token account di servizio
Assicurati che sia selezionato il tipo di chiave JSON.
Fai clic su Crea. Il file della chiave JSON dell'account di servizio viene scaricato dalla macchina locale. Prendi nota della posizione e assicurati che sia archiviata in modo sicuro viene utilizzato in un secondo momento per generare token.
Configurazione dell'autenticazione per il servizio
Utilizza il progetto producer per tutti i passaggi di questa sezione.
Imposta l'autenticazione nella configurazione dell'API gRPC
L'autenticazione per ESP è configurata in authentication
del tuo file YAML di configurazione API gRPC. La configurazione con
l'autenticazione per questo servizio di esempio è
api_config_auth.yaml
La sezione providers
specifica i provider di autenticazione a cui vuoi
in questo caso vuoi usare un account di servizio Google come
di autenticazione, La sezione rules
specifica che sono necessari token
di questo provider per accedere a tutti i metodi del tuo servizio.
Nella tua copia di questo file dal repository clonato:
- Sostituisci
MY_PROJECT_ID
con l'ID del tuo progetto producer. - Modifica
SERVICE-ACCOUNT-ID
nella sezioneauthentication
(sia inissuer
ejwks_uri
) all'ID account di servizio consumer che hai annotato. nella sezione precedente. Questo indica a ESP che vuoi concedere l'accesso al servizio agli utenti che forniscono token validi da questo un particolare account di servizio. - Se vuoi, aggiungi
jwt_locations
sotto l'elementoproviders
. Puoi utilizzare questo valore per definire una posizione JWT personalizzata. Le località JWT predefinite sono i metadatiAuthorization
(precedenti con "Bearer ") e i metadatiX-Goog-Iap-Jwt-Assertion
.
Salva il file per il passaggio successivo.
Esegui il deployment della configurazione e del servizio
Questi passaggi sono gli stessi di Introduzione a gRPC su GKE:
Esegui il deployment della configurazione del servizio in Endpoints: devi eseguire questa operazione anche se l'hai fatto per il tutorial, poiché si tratta di un configurazione diversa. Prendi nota del nome del servizio restituito:
gcloud endpoints services deploy api_descriptor.pb api_config_auth.yaml --project PRODUCER_PROJECT
Crea un cluster di container e autenticare
kubectl
nel cluster, se non l'hai ancora fatto.Esegui il deployment dell'API e di ESP di esempio nel cluster. Se utilizzi progetti di produttori e consumatori separati, assicurati innanzitutto di aver impostato il progetto appropriato nello strumento a riga di comando
gcloud
:gcloud config set project PRODUCER_PROJECT
Chiamata a metodi autenticati da un client gRPC
Infine, lato client, puoi utilizzare la chiave dell'account di servizio per generare un
token JWT e poi utilizzarlo per chiamare un metodo autenticato di Bookstore.
Installa innanzitutto i requisiti Python appropriati per generare il token e
eseguire il client di esempio. Assicurati di essere nel
python-docs-samples/endpoints/bookstore-grpc
cartella del client clonato, quindi:
virtualenv bookstore-env
source bookstore-env/bin/activate
pip install -r requirements.txt
Genera un token JWT
In questo esempio, la libreria utilizza l'autenticazione tra servizi in cui il servizio chiamante è autenticato esclusivamente dal proprio account di servizio, quindi è semplice creare un token appropriato da inviare con le nostre richieste. Tieni presente che puoi anche richiedono un'autenticazione service-to-service più rigorosa quando deve essere ulteriormente autenticato da Google (utilizzando token ID Google).
Per questo esempio, lo script Python fornito può generare un token dal file della chiave JSON scaricato in precedenza, utilizzando un ID utente e un'email fittizi.
Per generare un token utilizzando lo script:
Genera un token JWT e assegnalo alla variabile
$JWT_TOKEN
:JWT_TOKEN=$(python jwt_token_gen.py \ --file=[SERVICE_ACCOUNT_FILE] \ --audiences=[SERVICE_NAME] \ --issuer=[SERVICE-ACCOUNT-ID])
dove:
[SERVICE_ACCOUNT_FILE]
è il file JSON dell'account di servizio consumer scaricato chiave.[SERVICE_NAME]
è il nome del servizio Bookstore restituito quando hai eseguito il deployment della configurazione del servizio aggiornata in Endpoints.[SERVICE-ACCOUNT-ID]
è l'ID completo dell'account di servizio consumer quando generato l'account di servizio.
Effettua una chiamata gRPC autenticata
In quest'ultimo passaggio
bookstore_client.py
,
che è lo stesso client utilizzato
Tutorial. Per effettuare una chiamata autenticata,
il cliente trasmette il JWT
metadata con i relativi
.
Per eseguire l'esempio:
Utilizza
kubectl get services
per ottenere l'indirizzo IP esterno della libreria di cui è stato eseguito il deployment:#kubectl get services NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE echo 10.11.246.240 104.196.186.92 80/TCP 10d endpoints 10.11.243.168 104.196.210.50 80/TCP,8090/TCP 10d esp-grpc-bookstore 10.11.254.34 104.196.60.37 80/TCP 1d kubernetes 10.11.240.1 <none> 443/TCP 10d
In questo caso, si tratta del servizio
esp-grpc-bookstore
e il suo IP esterno è104.196.60.37
.Assegna l'indirizzo IP alla variabile
EXTERNAL_IP
EXTERNAL_IP=104.196.60.37
Elenca tutti gli scaffali del servizio Libreria:
python bookstore_client.py --port=80 --host=$EXTERNAL_IP --auth_token=$JWT_TOKEN
Il servizio restituisce tutti gli scaffali della libreria corrente. Puoi raddoppiare Controllalo non fornendo un token o specificando l'account di servizio errato ID durante la generazione del JWT. Il comando non dovrebbe riuscire.