Puoi implementare l'autenticazione tra i servizi utilizzando un account di servizio in un servizio gRPC. Questa pagina mostra l'autenticazione da servizio a servizio attraverso un esempio completo, che include la configurazione di Extensible Service Proxy (ESP) in un servizio gRPC per supportare le richieste autenticate e come chiamare il servizio da un client gRPC.
Affinché un servizio possa effettuare chiamate autenticate in un'API Cloud Endpoints, il servizio di chiamata 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 token web JSON (JWT) personalizzato firmato solo dall'account di servizio del chiamante. L'ESP verifica che l'attestazione iss
nel JWT corrisponda all'impostazione issuer
nella configurazione del servizio. ESP non controlla le autorizzazioni di Identity and Access Management concesse all'account di servizio.
Nel nostro esempio, configuri e utilizzi la forma più semplice di autenticazione tra servizi, in cui il client utilizza il proprio account di servizio Google Cloud per generare JWT di autenticazione. L'approccio per altri metodi di autenticazione è simile, anche se il processo lato client per ottenere token di autenticazione validi dipenda dal metodo di autenticazione utilizzato.
Prima di iniziare
Questa guida utilizza l'esempio di libreria utilizzato nei nostri 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 dei tutorial per configurare un progetto se non ne hai già uno.
In questo esempio, utilizzerai il deployment in Google Kubernetes Engine, anche se la configurazione dell'autenticazione è la stessa per Compute Engine.
Nell'esempio viene fatto riferimento a due progetti Google Cloud Platform:
- Il progetto producer di servizio, che è 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 servizi. Assicurati di essere nel tuo progetto consumer.
- Nella pagina Credenziali, nell'elenco a discesa Crea credenziali, seleziona Chiave account di servizio.
Nella pagina Crea chiave dell'account di servizio, selezionalo se hai già un account di servizio che vuoi utilizzare. Altrimenti, 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 dell'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 seguenti ruoli:
- 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 sulla macchina locale. Prendi nota della posizione e assicurati che sia archiviata in modo sicuro perché in seguito verrà utilizzata per generare token.
Configurazione dell'autenticazione per il servizio
Utilizza il progetto del produttore per tutti i passaggi della sezione.
Imposta l'autenticazione nella configurazione dell'API gRPC
L'autenticazione per ESP è configurata nella sezione authentication
del file YAML di configurazione dell'API gRPC. La configurazione con
autenticazione per questo servizio di esempio è in
api_config_auth.yaml
.
La sezione providers
specifica i provider di autenticazione che vuoi utilizzare, in questo caso un account di servizio Google come provider di autenticazione. La sezione rules
specifica che sono necessari token
da questo provider per accedere a tutti i metodi del tuo servizio.
Nella tua copia di questo file dal repository clonato:
- Modifica
MY_PROJECT_ID
nell'ID del tuo progetto producer. - Modifica
SERVICE-ACCOUNT-ID
nella sezioneauthentication
(nei valoriissuer
ejwks_uri
) nell'ID account di servizio consumer che hai annotato nella sezione precedente. In questo modo indichi a ESP che vuoi concedere l'accesso al tuo servizio agli utenti che forniscono token validi da questo account di servizio specifico. - Se vuoi, aggiungi
jwt_locations
sotto l'elementoproviders
. Puoi utilizzare questo valore per definire una località JWT personalizzata. Le posizioni JWT predefinite sono i metadatiAuthorization
(preceduti da "Bearer ") e i metadatiX-Goog-Iap-Jwt-Assertion
.
Salva il file per il passaggio successivo.
Eseguire il deployment della configurazione e del servizio
Questi passaggi sono gli stessi descritti in Introduzione a gRPC su GKE:
Esegui il deployment della configurazione del servizio in Endpoints: devi eseguire questa operazione anche se hai eseguito il deployment per il tutorial, poiché si tratta di una 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 autentica
kubectl
nel cluster, se non l'hai ancora fatto.Esegui il deployment dell'API e dell'ESP di esempio nel cluster. Se utilizzi progetti producer e consumer separati, assicurati innanzitutto di aver impostato il progetto appropriato all'interno dello strumento a riga di comando
gcloud
:gcloud config set project PRODUCER_PROJECT
Chiamata a metodi autenticati da un client gRPC
Infine, sul lato client, puoi utilizzare la chiave dell'account di servizio per generare un token JWT e quindi utilizzarlo per chiamare un metodo Bookstore autenticato.
Innanzitutto, installa i requisiti Python appropriati per generare il token e per eseguire il client di esempio. Assicurati di essere nella cartella python-docs-samples/endpoints/bookstore-grpc
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 service-to-service, in cui il servizio di chiamata viene autenticato puramente dal suo account di servizio. Di conseguenza, creare un token appropriato da inviare con le nostre richieste è semplice. Tieni presente che puoi anche richiedere un'autenticazione service-to-service più rigorosa, in cui il token generato deve essere ulteriormente autenticato da Google (utilizzando un token ID Google).
Per questo esempio, lo script Python fornito può generare un token dal file di chiave JSON scaricato in precedenza, utilizzando un'email e un ID utente fittizio.
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 di chiave JSON dell'account di servizio consumer scaricato.[SERVICE_NAME]
è il nome del servizio Bookstore restituito quando hai eseguito il deployment della configurazione aggiornata del servizio negli endpoint.[SERVICE-ACCOUNT-ID]
è l'ID account di servizio consumer completo quando hai generato l'account di servizio.
Effettua una chiamata gRPC autenticata
In quest'ultimo passaggio viene utilizzato
bookstore_client.py
,
che è lo stesso client utilizzato nei
Tutorial. Per effettuare una chiamata autenticata, il client passa il JWT come metadati con la chiamata al metodo.
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 attuale. Puoi verificarlo non fornendo un token o specificando l'ID account di servizio errato quando generi il JWT. Il comando non dovrebbe riuscire.