É possível implementar autenticação entre serviços usando uma conta de serviço em um serviço gRPC. Nesta página, mostramos como usar a autenticação serviço a serviço com um exemplo completo, inclusive como configurar o Extensible Service Proxy (ESP) em um serviço gRPC para dar suporte a solicitações autenticadas e como chamar o serviço em um cliente gRPC.
Para que qualquer serviço faça chamadas autenticadas para uma API do Cloud Endpoints, ele precisa ter uma conta de serviço e enviar um token de autenticação na chamada. O autor da chamada precisa usar um token de ID do Google ou um JSON Web Token (JWT) personalizado, assinado somente pela conta de serviço do autor da chamada. O ESP verifica se a declaração iss no JWT corresponde a issuer na configuração do serviço. O ESP não
verifica as permissões de gerenciamento de identidade e acesso
que foram concedidas na conta de serviço.
Em nosso exemplo, você configura e usa a forma mais simples de autenticação de serviço em serviço, em que o cliente usa a conta de serviço Google Cloud para gerar JWTs de autenticação. A abordagem por outros métodos de autenticação é semelhante, mas o processo no lado do cliente para conseguir tokens de autenticação válidos depende do método usado para isso.
Antes de começar
Este guia usa o exemplo Bookstore que aparece em nossos tutoriais.
Clone o repositório "git" no local em que o código de exemplo do gRPC está hospedado:
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.gitAltere o diretório de trabalho:
cd python-docs-samples/endpoints/bookstore-grpc/Siga as instruções nos tutoriais para configurar um projeto caso ainda não tenha um.
Neste exemplo, usaremos a implantação no Google Kubernetes Engine, ainda que a configuração de autenticação seja a mesma para o Compute Engine.
No exemplo, são mencionados dois projetos do Google Cloud Platform:
- o projeto de produtor de serviços, que é proprietário do serviço Cloud Endpoints para gRPC;
- o projeto de consumidor de serviços, que é proprietário do cliente gRPC.
Como criar a conta de serviço e a chave do consumidor
Para criar a conta de serviço e chave para o projeto de consumidor:
- No console Google Cloud , acesse "APIs e serviços". Verifique se você está no seu projeto de consumidor.
- Na página Credenciais, na lista suspensa Criar credenciais, selecione Chave da conta de serviço.
Na página Criar chave da conta de serviço, selecione a conta de serviço atual que você quer usar. Caso contrário, na lista suspensa da Conta de serviço, selecione Nova conta de serviço e digite um nome de conta.
Será criado um código de conta de serviço correspondente. Anote o código, que será necessário nas próximas seções. Exemplo:
service-account-name@YOUR_PROJECT_ID.iam.gserviceaccount.comClique na lista suspensa Papel e selecione o seguinte:
- Contas de serviço > Usuário da conta de serviço
- Contas de serviço > Criador do token da conta de serviço
Verifique se o tipo de chave JSON está selecionado.
Clique em Criar. O download do arquivo de chave JSON da conta de serviço é feito em sua máquina local. Observe a localização e verifique se o arquivo está armazenado com segurança. Ele será necessário posteriormente para a geração de tokens.
Como configurar a autenticação do serviço
Use o projeto de produtor em todas as etapas nesta seção.
Configurar a autenticação na configuração da API gRPC
A autenticação para o ESP é configurada na seção authentication do arquivo YAML de configuração da API gRPC. A configuração com autenticação para este exemplo de serviço está em api_config_auth.yaml (em inglês).
Na seção providers, especificamos os provedores de autenticação que você quer usar. Nesse caso, que você quer usar uma conta de serviço do Google como um provedor de autenticação. A seção rules especifica que você requer tokens desse provedor para conceder acesso a todos os métodos do seu serviço.
Em sua cópia desse arquivo do repositório clonado:
- Altere
MY_PROJECT_IDpara o ID do projeto do produtor. - Altere
SERVICE-ACCOUNT-IDna seçãoauthentication(nos valoresissuerejwks_uri) para o ID da conta de serviço de consumidor anotado na seção anterior. Isso informa ao ESP que você quer conceder acesso ao serviço aos usuários que informarem tokens válidos a partir desta conta de serviço específica. - Opcionalmente, adicione
jwt_locationsno elementoproviders. Use esse valor para definir um local personalizado do JWT. Os locais padrão do JWT são os metadadosAuthorization(prefixados por "Bearer ") e os metadadosX-Goog-Iap-Jwt-Assertion.
Salve o arquivo para a próxima etapa.
Implantar a configuração e o serviço
Estas etapas são as mesmas da Introdução ao gRPC no GKE:
Implemente sua configuração de serviço no Endpoints: como essa é uma configuração diferente, faça isso mesmo que já o tenha feito para o tutorial. Observe o nome de serviço retornado:
gcloud endpoints services deploy api_descriptor.pb api_config_auth.yaml --project PRODUCER_PROJECTCrie um cluster de contêiner e autentique
kubectlno cluster, caso ainda não tenha feito isso.Implante a API de amostra e o ESP no cluster. Se você usa projetos separados de produtor e consumidor, primeiro verifique se definiu o projeto apropriado na ferramenta de linha de comando
gcloud:gcloud config set project PRODUCER_PROJECT
Como chamar métodos autenticados a partir de um cliente gRPC
Por fim, no lado do cliente, é possível usar a chave da conta de serviço para gerar um token JWT e usá-lo para chamar um método de Bookstore autenticado.
Primeiro instale os requisitos apropriados do Python para gerar o token e executar o cliente de exemplo. Confira se você está na pasta python-docs-samples/endpoints/bookstore-grpc do seu cliente clonado e em seguida:
virtualenv bookstore-env
source bookstore-env/bin/activate
pip install -r requirements.txt
Gerar um token JWT
Neste exemplo, a Bookstore está usando a autenticação serviço a serviço em que o serviço que faz a chamada é simplesmente autenticado pela respectiva conta de serviço. Isso simplifica a criação de um token apropriado para enviar com nossas solicitações. Observe que também é possível exigir uma autenticação serviço a serviço mais restrita, em que o token gerado precisa ser autenticado também pelo Google (usando um token de código do Google).
Neste exemplo, o script Python fornecido gera um token do arquivo de chave JSON, de que foi feito o download anteriormente, usando e-mail de usuário e código fictícios.
Para gerar um token usando o script:
Gere um token JWT e atribua-o à variável
$JWT_TOKEN:JWT_TOKEN=$(python jwt_token_gen.py \ --file=[SERVICE_ACCOUNT_FILE] \ --audiences=[SERVICE_NAME] \ --issuer=[SERVICE-ACCOUNT-ID])em que:
[SERVICE_ACCOUNT_FILE]é o arquivo de chave JSON da conta de serviço de consumidor salvo;[SERVICE_NAME]é o nome do serviço Bookstore retornado quando você implantou sua configuração de serviço atualizada no Endpoints;[SERVICE-ACCOUNT-ID]é o ID completo da conta de serviço do consumidor quando você gerou sua conta de serviço.
Fazer uma chamada gRPC autenticada
Esta última etapa usa bookstore_client.py (em inglês), que é o mesmo cliente usado nos tutoriais. Para fazer uma chamada autenticada, o cliente transmite o JWT como metadados (em inglês) com a respectiva chamada de método.
Para executar o exemplo:
Use
kubectl get servicespara receber o endereço IP externo para o Bookstore implantado:#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 10dNesse caso, é o serviço
esp-grpc-bookstoree seu IP externo é104.196.60.37.Atribua o endereço IP à variável
EXTERNAL_IP:EXTERNAL_IP=104.196.60.37Liste todas as estantes do serviço Bookstore:
python bookstore_client.py --port=80 --host=$EXTERNAL_IP --auth_token=$JWT_TOKENO serviço retorna todas as estantes no Bookstore atual. É possível confirmar isso: se você não fornecer um token ou se especificar um ID incorreto da conta de serviço ao gerar o JWT, haverá uma falha no comando.