Como restringir o acesso à API com chaves de API

Use as chaves de API para restringir o acesso a métodos específicos ou a todos os métodos em uma API. Nesta página, você aprende a restringir o acesso à API para os clientes com uma chave, bem como a criar uma chave de API.

O Extensible Service Proxy (ESP) usa a API Service Control para validar uma chave de API e a associação com a API ativada de um projeto. Se você definir um requisito de chave para uma API, as solicitações para métodos, classes ou APIs protegidos serão rejeitadas a menos que elas tenham uma chave gerada no seu projeto ou em outros projetos de desenvolvedores com acesso para ativar sua API. O projeto em que a chave de API foi criada não é registrado nem adicionado ao cabeçalho da solicitação. No entanto, é possível visualizar o projeto do Google Cloud a que um cliente está associado na página Endpoints > Serviços, conforme descrito em Filtrar por um projeto de consumidor específico.

Para mais informações sobre em qual projeto do Google Cloud uma chave de API precisa ser criada, consulte Como compartilhar APIs protegidas por chaves.

Como restringir o acesso a todos os métodos da API

Para exigir uma chave de API para acessar todos os métodos da API:

  1. Abra o arquivo openapi.yaml do projeto em um editor de texto.

  2. Em securityDefinitions:, adicione a api_key: os valores apiKey, key e query como mostrado no snippet de código de amostra:

    securityDefinitions:
      # This section configures basic authentication with an API key.
      api_key:
        type: "apiKey"
        name: "key"
        in: "query"

    Isso estabelece um "esquema de segurança" chamado api_key, que pode ser usado para proteger a API. Para outras opções de definição de api_key, consulte Limitações de definição de chave da API.

  3. No nível superior do arquivo (sem recuo ou aninhamento), adicione api_key: [] à diretiva security. Pode ser necessário adicionar a diretiva security, ou ela pode já estar presente:

      security:
        - api_key: []
    

    Esta diretiva aplica o esquema de segurança api_key a todos os métodos no arquivo. Não coloque nada dentro dos colchetes. A especificação da OpenAPI precisa de uma lista de esquemas de segurança vazia que não usa o OAuth.

Como restringir o acesso a métodos específicos da API

Para exigir uma chave de API para acessar um método específico:

  1. Abra o arquivo openapi.yaml do projeto em um editor de texto.

  2. No nível superior do arquivo (sem recuo ou aninhamento), adicione uma diretiva de segurança vazia para aplicá-la à API inteira:

    security: []
    
  3. Em securityDefinitions:, adicione a api_key: os valores apiKey, key e query como mostrado no snippet de código de amostra:

    securityDefinitions:
      # This section configures basic authentication with an API key.
      api_key:
        type: "apiKey"
        name: "key"
        in: "query"

    Isso estabelece um "esquema de segurança" chamado api_key, que pode ser usado para proteger a API. Para outras opções de definição de api_key, consulte Limitações de definição de chave da API.

  4. Adicione api_key: [] à diretiva security na definição do método:

    ...
    paths:
      "/echo":
    post:
      description: "Echo back a given message."
      operationId: "echo"
      security:
      - api_key: []
      produces:
      ...
    

    Esta diretiva aplica o esquema de segurança api_key ao método. Não coloque nada dentro dos cholchetes. A especificação da OpenAPI precisa de uma lista de esquemas de segurança vazia que não usa o OAuth.

Como remover a restrição de chave de API de um método

Para desativar a validação da chave de API de um método específico mesmo que você tenha restringido o acesso da API:

  1. Abra o arquivo openapi.yaml do projeto em um editor de texto.

  2. Adicione uma diretiva security vazia na definição do método:

    ...
    paths:
      "/echo":
    post:
      description: "Echo back a given message."
      operationId: "echo"
      security: []
      produces:
      ...
    

Como chamar uma API usando uma chave

Se uma API ou método de API exigir uma chave de API, forneça a chave usando um parâmetro de consulta chamado key, conforme mostrado no seguinte exemplo de curl:

 curl "${ENDPOINTS_HOST}/echo?key=${ENDPOINTS_KEY}"

em que ENDPOINTS_HOST e ENDPOINTS_KEY são variáveis de ambiente que contêm o nome do host da API e a chave de API, respectivamente.

Como compartilhar APIs protegidas por chaves

As chaves de API são associadas ao projeto do Google Cloud em que foram criadas. Se você decidiu exigir uma chave para sua API, o projeto do Google Cloud em que a chave é criada vai depender das respostas às perguntas a seguir:

  • Você precisa diferenciar os chamadores de sua API para poder usar recursos do Endpoints, como quotas?
  • Todos os autores das chamadas da API têm os próprios projetos do Google Cloud?
  • Você precisa configurar diferentes restrições de chave de API?

Use a árvore de decisões abaixo como guia para decidir em qual projeto do Google Cloud criar a chave de API.

Árvore de decisão de chave de API

Conceder permissão para ativar a API

Quando você precisa distinguir os autores das chamadas da sua API, e cada um tem o próprio projeto do Google Cloud, é possível conceder permissão aos principais para ativar a API no próprio projeto do Google Cloud. Dessa forma, os usuários da API podem criar a própria chave para usar com ela.

Por exemplo, digamos que sua equipe tenha criado uma API para uso interno por diversos programas cliente na empresa e cada um deles tenha o próprio projeto no Google Cloud. Para diferenciar os autores das chamadas da API, a chave de cada um deles precisa ser criada em um projeto do Google Cloud diferente. Dê permissão para que seus colegas ativem a API no projeto do Google Cloud ao qual o programa cliente está associado.

Veja como permitir que os usuários criem a própria chave de API:

  1. No projeto do Google Cloud em que a API está configurada, conceda a cada usuário a permissão para ativar a API.
  2. Entre em contato com os usuários para informar que eles podem ativar a API no projeto do Google Cloud deles e criar uma chave de API.

Criar um projeto separado do Google Cloud para cada autor da chamada

Quando você precisar diferenciar os autores das chamadas da API, mas nem todos tiverem projetos do Google Cloud, crie um projeto separado no Google Cloud e uma chave de API para cada um. Antes de criar os projetos, pense nos nomes deles para facilitar a identificação do cliente associado a cada um.

Por exemplo, digamos que você tenha clientes externos da API e não tenha ideia de como foram criados os programas clientes que chamam essa API. Talvez alguns clientes usem os serviços do Google Cloud e tenham um projeto dele e outros não. Para diferenciar os autores das chamadas, crie um projeto no Google Cloud e uma chave de API separados para cada um deles.

Para criar um projeto do Google Cloud e uma chave de API separados para cada autor da chamada:

  1. Crie um projeto separado para cada autor da chamada.
  2. Em cada projeto, ative a API e crie uma chave de API.
  3. Forneça a chave de API para cada autor da chamada.

Criar uma chave de API para cada autor da chamada

Quando você não precisa distinguir entre os autores das chamadas de API, mas quer adicionar restrições de chave de API, é possível criar uma chave de API separada para cada autor da chamada no mesmo projeto.

Veja como criar uma chave de API para cada autor da chamada no mesmo projeto:

  1. No projeto em que a API estiver ativada ou configurada, crie uma chave de API para cada cliente com as restrições necessárias.
  2. Forneça a chave de API para cada autor da chamada.

Criar uma chave de API para todos os autores das chamadas

Quando você não precisa distinguir entre os autores das chamadas de API e não precisa adicionar restrições, mas ainda quer exigir uma chave de API (para impedir o acesso anônimo, por exemplo), é possível criar uma chave para todos os autores de chamadas usarem.

Se quiser criar uma chave de API para todos os autores das chamadas:
  1. No projeto em que a API estiver ativada ou configurada, crie uma chave de API para todos os autores das chamadas.
  2. Forneça a mesma chave de API para cada autor da chamada.

Práticas recomendadas

Se você depende de chaves de API para proteger o acesso aos dados do usuário e à API, defina a sinalização --service_control_network_fail_open como close ao configurar a inicialização do Extensible Service Proxy V2 (ESPv2) opções. O valor padrão da sinalização é open..

O ESPv2 chama o Service Control para verificar as chaves de API. Se houver falhas de rede ao se conectar ao Service Control e o ESPv2 não puder verificar a chave de API, todas as possíveis solicitações feitas à API com chaves fraudulentas serão rejeitadas.

A seguir