Puoi implementare l'autenticazione tra i servizi utilizzando un account di servizio in un servizio gRPC. Questa pagina illustra l'autenticazione da servizio a servizio tramite un esempio completo, che include la configurazione di Extensible Service Proxy (ESP) in un servizio gRPC per supportare le richieste autenticate e la chiamata al servizio da un client gRPC.
Affinché un servizio possa effettuare chiamate autenticate a un'API Cloud Endpoints, il servizio chiamante deve avere un
service account
e deve inviare un token di autenticazione nella chiamata. Il chiamante deve utilizzare un
token ID Google
o un
JSON Web Token (JWT) personalizzato firmato solo
dal account di servizio del chiamante. ESP verifica che l'attestazione
iss nel JWT corrisponda all'impostazione issuer nella configurazione del servizio. ESP non verifica le autorizzazioni di Identity and Access Management concesse al account di servizio.
Nel nostro esempio, configuri e utilizzi la forma più semplice di autenticazione da servizio a servizio, in cui il client utilizza il proprio Google Cloud service account per generare JWT di autenticazione. L'approccio per gli 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 utilizza l'esempio di Bookstore 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.gitCambia 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 dell'autenticazione è la stessa per Compute Engine.
Nell'esempio vengono fatti riferimento a due progetti Google Cloud Platform:
- Il progetto produttore del servizio, ovvero il progetto proprietario del servizio Cloud Endpoints per gRPC.
- Il progetto consumer del servizio, ovvero il progetto proprietario del client gRPC.
Creazione del account di servizio e della chiave del consumer
Per creare il account di servizio e la chiave per il progetto consumer:
- Nella Google Cloud console, vai ad API e servizi. Assicurati di trovarti nel progetto consumer.
- Nella pagina Credenziali, nell'elenco a discesa Crea credenziali , seleziona Chiave account di servizio.
Nella pagina Crea chiave account di servizio, seleziona un service account esistente che vuoi utilizzare, se ne hai uno. In caso contrario, nell'elenco a discesa Service account, seleziona Nuovo service account e digita un nome per l'account.
Viene creato un ID service account corrispondente. Prendi nota dell'ID, perché è necessario nelle sezioni seguenti. Ad esempio:
service-account-name@YOUR_PROJECT_ID.iam.gserviceaccount.comFai clic sull'elenco a discesa Ruolo e seleziona i seguenti ruoli:
- Service account > Utente account di servizio
- Service account > Creatore token account di servizio
Assicurati che sia selezionato il tipo di chiave JSON.
Fai clic su Crea. Il file della chiave JSON del account di servizio viene scaricato sul computer locale. Prendi nota della posizione e assicurati che sia archiviato in modo sicuro, perché verrà utilizzato in un secondo momento per generare i token.
Configurazione dell'autenticazione per il servizio
Utilizza il progetto produttore per tutti i passaggi di questa sezione.
Configurare 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
l'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, vuoi utilizzare un account di servizio Google come provider di autenticazione. La sezione rules specifica che sono necessari i token di questo provider per accedere a tutti i metodi del servizio.
Nella tua copia di questo file dal repository clonato:
- Modifica
MY_PROJECT_IDcon l'ID del progetto produttore. - Modifica
SERVICE-ACCOUNT-IDnella sezioneauthentication(nei valoriissuerejwks_uri) con l'ID del account di servizio consumer che hai annotato nella sezione precedente. In questo modo, ESP sa che vuoi concedere l'accesso al tuo servizio agli utenti che forniscono token validi da questo account di servizio specifico. - Facoltativamente, aggiungi
jwt_locationssotto l'elementoproviders. Puoi utilizzare questo valore per definire una posizione JWT personalizzata. Le posizioni JWT predefinite sono i metadatiAuthorization(con il prefisso "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 di quelli descritti in Guida introduttiva a gRPC su GKE:
Esegui il deployment della configurazione del servizio in Endpoints: devi farlo anche se l'hai già fatto per il tutorial, perché 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_PROJECTCrea un cluster di container e autentica
kubectlnel cluster, se non l'hai già fatto.Esegui il deployment dell'API di esempio e di ESP nel cluster. Se utilizzi progetti produttore e consumer separati, assicurati innanzitutto di aver impostato il progetto appropriato nello strumento a riga di comando
gcloud:gcloud config set project PRODUCER_PROJECT
Chiamare metodi autenticati da un client gRPC
Infine, lato client, puoi utilizzare la chiave del account di servizio per generare un token JWT e poi utilizzare il token per chiamare un metodo Bookstore autenticato.
Innanzitutto, installa i requisiti Python appropriati per generare il token ed eseguire il client di esempio. Assicurati di trovarti 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
Generare un token JWT
In questo esempio, Bookstore utilizza l'autenticazione da servizio a servizio in cui il servizio chiamante viene autenticato esclusivamente dal suo account di servizio, quindi la creazione di un token appropriato da inviare con le richieste è semplice. Tieni presente che puoi anche richiedere un'autenticazione da servizio a servizio 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 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 della chiave JSON del account di servizio consumer scaricato.[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 del account di servizio consumer quando hai generato il account di servizio.
Effettuare una chiamata gRPC autenticata
Questo ultimo passaggio utilizza
bookstore_client.py,
ovvero 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 servicesper ottenere l'indirizzo IP esterno del Bookstore di cui hai 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 10dIn questo caso, si tratta del servizio
esp-grpc-bookstoree il suo IP esterno è104.196.60.37.Assegna l'indirizzo IP alla variabile
EXTERNAL_IPEXTERNAL_IP=104.196.60.37Elenca tutti gli scaffali del servizio Bookstore:
python bookstore_client.py --port=80 --host=$EXTERNAL_IP --auth_token=$JWT_TOKENIl servizio restituisce tutti gli scaffali del Bookstore corrente. Puoi ricontrollare non fornendo un token o specificando l'ID del account di servizio errato durante la generazione del JWT. Il comando dovrebbe non riuscire.