Restringir el acceso a las APIs con claves de API

Puedes usar claves de API para restringir el acceso a métodos de API específicos o a todos los métodos de una API. En esta página se describe cómo restringir el acceso a la API a los clientes que tienen una clave de API y también se muestra cómo crear una clave de API.

El proxy de servicios extensible (ESP) usa la API Service Control para validar una clave de API y su asociación con la API habilitada de un proyecto. Si estableces un requisito de clave de API en tu API, las solicitudes al método, la clase o la API protegidos se rechazarán a menos que tengan una clave generada en tu proyecto o en otros proyectos pertenecientes a desarrolladores a los que hayas concedido acceso para habilitar tu API. El proyecto en el que se creó la clave de API no se registra y no se añade al encabezado de la solicitud. Sin embargo, puede ver el proyecto Google Cloud con el que está asociado un cliente en Puntos finales > Servicios, tal como se describe en Filtrar por un proyecto de consumidor específico.

Para obtener información sobre en qué Google Cloud proyecto se debe crear una clave de API, consulta Compartir APIs protegidas por claves de API.

Restringir el acceso a todos los métodos de la API

Para requerir una clave de API para acceder a todos los métodos de una API, sigue estos pasos:

  1. Abre el archivo openapi.yaml de tu proyecto en un editor de texto.

  2. En securityDefinitions:, añade los valores api_key: apiKey, key y query tal como se muestra en el fragmento de código de ejemplo:

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

    De esta forma, se establece un "esquema de seguridad" llamado api_key, que puedes usar para proteger la API. Para ver otras opciones de definición de api_key, consulta las limitaciones de la definición de claves de API.

  3. En el nivel superior del archivo (sin sangría ni anidación), añade api_key: [] a la directiva security . Puede que tengas que añadir la directiva security o que ya esté presente:

      security:
        - api_key: []
    

    Esta directiva aplica el esquema de seguridad api_key a todos los métodos del archivo. No incluyas nada entre los corchetes. La especificación de OpenAPI requiere una lista vacía para los esquemas de seguridad que no usan OAuth.

Restringir el acceso a métodos de API específicos

Para requerir una clave de API para un método específico, sigue estos pasos:

  1. Abre el archivo openapi.yaml de tu proyecto en un editor de texto.

  2. En el nivel superior del archivo (sin sangría ni anidación), añade una directiva de seguridad vacía para aplicarla a toda la API:

    security: []
    
  3. En securityDefinitions:, añade los valores api_key: apiKey, key y query tal como se muestra en el fragmento de código de ejemplo:

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

    De esta forma, se establece un "esquema de seguridad" llamado api_key, que puedes usar para proteger la API. Para ver otras opciones de definición de api_key, consulta las limitaciones de la definición de claves de API.

  4. Añade api_key: [] a la directiva security en la definición del método:

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

    Esta directiva aplica el esquema de seguridad api_key al método. No coloques nada entre los corchetes. La especificación de OpenAPI requiere una lista vacía para los esquemas de seguridad que no usan OAuth.

Quitar la restricción de clave de API de un método

Para desactivar la validación de la clave de API de un método concreto, aunque hayas restringido el acceso a la API:

  1. Abre el archivo openapi.yaml de tu proyecto en un editor de texto.

  2. Añade una directiva security vacía en la definición del método:

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

Llamar a una API con una clave de API

Si una API o un método de API requieren una clave de API, proporciona la clave mediante un parámetro de consulta llamado key, como se muestra en el siguiente ejemplo de curl:

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

donde ENDPOINTS_HOST y ENDPOINTS_KEY son variables de entorno que contienen el nombre de host y la clave de la API, respectivamente.

Compartir APIs protegidas con una clave de API

Las claves de API están asociadas al Google Cloud proyecto en el que se han creado. Si has decidido que tu API requiera una clave de API, el Google Cloud proyecto en el que se cree la clave de API dependerá de las respuestas a las siguientes preguntas:

  • ¿Necesitas distinguir entre los llamantes de tu API para poder usar funciones de Endpoints, como las cuotas?
  • ¿Todos los usuarios que llaman a tu API tienen sus propios Google Cloud proyectos?
  • ¿Necesitas configurar diferentes restricciones de clave de API?

Puedes usar el siguiente diagrama de flujo para decidir en qué Google Cloud proyecto crear la clave de API.

Árbol de decisión de la clave de API

Concede permiso para habilitar la API

Si necesitas distinguir entre los llamantes de tu API y cada llamante tiene su propio proyecto, puedes conceder a las principales permiso para habilitar la API en su propio proyecto. Google Cloud Google Cloud De esta forma, los usuarios de tu API pueden crear su propia clave de API para usarla con tu API.

Por ejemplo, supongamos que tu equipo ha creado una API para uso interno de varios programas cliente de tu empresa y que cada programa cliente tiene su propio Google Cloud proyecto. Para distinguir entre los llamantes de tu API, la clave de API de cada llamante debe crearse en un proyecto Google Cloud diferente. Puedes conceder permiso a tus compañeros para que habiliten la API en el Google Cloud proyecto al que esté asociado el programa cliente.

Para permitir que los usuarios creen su propia clave de API, sigue estos pasos:

  1. En el Google Cloud proyecto en el que esté configurada tu API, concede a cada usuario el permiso para habilitar tu API.
  2. Ponte en contacto con los usuarios e infórmales de que pueden habilitar tu API en su propio proyecto Google Cloud y crear una clave de API.

Crea un Google Cloud proyecto independiente para cada persona que llame

Si necesitas distinguir entre los llamantes de tu API y no todos los llamantes tienen proyectos de Google Cloud , puedes crear un proyecto de Google Cloud y una clave de API independientes para cada llamante. Antes de crear los proyectos, piensa en los nombres que les vas a dar para poder identificar fácilmente la persona que llama asociada a cada proyecto.

Por ejemplo, supongamos que tienes clientes externos de tu API y no sabes cómo se crearon los programas de cliente que llaman a tu API. Puede que algunos clientes usen Google Cloud servicios y tengan un Google Cloud proyecto, y puede que otros no. Para distinguir entre los llamantes, debes crear un Google Cloud proyecto y una clave de API independientes para cada uno.

Para crear un proyecto y una clave de API independientes para cada llamante, sigue estos pasos: Google Cloud

  1. Crea un proyecto independiente para cada persona que llame.
  2. En cada proyecto, habilita la API y crea una clave de API.
  3. Proporciona la clave de API a cada persona que llame.

Crear una clave de API para cada llamante

Si no necesitas distinguir entre los llamantes de tu API, pero quieres añadir restricciones a la clave de API, puedes crear una clave de API independiente para cada llamante en el mismo proyecto.

Para crear una clave de API para cada llamante del mismo proyecto, sigue estos pasos:

  1. En el proyecto en el que esté configurada tu API o en un proyecto en el que esté habilitada, crea una clave de API para cada cliente que tenga las restricciones de clave de API que necesites.
  2. Proporciona la clave de API a cada persona que llame.

Crear una clave de API para todos los llamantes

Si no necesitas distinguir entre los llamantes de tu API ni añadir restricciones de API, pero quieres requerir una clave de API (por ejemplo, para evitar el acceso anónimo), puedes crear una clave de API para que la usen todos los llamantes.

Para crear una clave de API para todos los llamantes, sigue estos pasos:
  1. En el proyecto en el que esté configurada tu API o en un proyecto en el que esté habilitada, crea una clave de API para todos los llamantes que tenga las restricciones de clave de API que necesites.
  2. Proporcionar la misma clave de API a todos los llamantes.

Prácticas recomendadas

Si utilizas claves de API para proteger el acceso a tu API y a los datos de los usuarios, asegúrate de definir la marca --service_control_network_fail_policy en close al configurar las opciones de inicio de Extensible Service Proxy V2 (ESPv2). El valor predeterminado de la marca es open..

ESPv2 llama a Service Control para verificar las claves de API. Si se producen fallos en la red al conectarse a Service Control y ESPv2 no puede verificar la clave de API, se rechazarán las solicitudes que se hagan a tu API con claves fraudulentas.

Siguientes pasos