Agrega restricciones a las claves de API

Las claves de API identifican tu aplicación o sitio web en Google Cloud. Las restricciones de clave de API garantizan que solo tus apps y sitios web puedan usar tus claves. Por motivos de seguridad, te recomendamos agregar restricciones que especifiquen lo siguiente:

Si un cliente usa una clave de API restringida para emitir una solicitud que no cumple con las restricciones de la clave de API, la solicitud falla. Por ejemplo, si una clave de API requiere que las solicitudes HTTP se emitan desde un dominio específico, pero que se recibe una solicitud HTTP de otro dominio, la solicitud se rechazará con un error.

Puedes agregar restricciones cuando creas una clave de API con el método CreateKey o puedes agregar las restricciones después de crear la clave con el método UpdateKey. En esta página, se describen las restricciones que puedes agregar a una clave de API y se indica cómo agregar esas restricciones.

Antes de comenzar

La página usa curl con la herramienta de línea de comandos oauth2l para enviar solicitudes a la API de claves de API. Consulta Comenzar a usar las claves de API para obtener detalles sobre cómo configurar la API.

Agrega restricciones de cliente

Las restricciones de cliente especifican qué sitios web, direcciones IP o apps pueden usar una clave de API. Agrega restricciones de cliente según el tipo de cliente que llama a tu API. Puedes especificar uno de los siguientes tipos de restricciones del cliente:

  • browserKeyRestrictions: las referencias HTTP (sitios web) que tienen permiso para usar la clave.
  • serverKeyRestrictions: Las direcciones IP de los emisores que pueden usar la clave.
  • androidKeyRestrictions: las apps para Android que tienen permiso para usar la clave
  • iosKeyRestrictions: las apps para iOS que tienen permiso para usar la clave.

Cómo agregar restricciones de navegación

El siguiente ejemplo muestra cómo llamar al método UpdateKey para restringir el referente HTTP a www.example.com:

gcurl https://apikeys.googleapis.com/v2/projects/PROJECT_NUMBER/locations/global/keys/KEY_ID?updateMask=restrictions \
  --request PATCH \
  --data '{
    "restrictions" : {
      "browserKeyRestrictions": {
        "allowedReferrers": "www.example.com"
      }
    }
    "etag": "ETAG"
  }'

Cuando la respuesta de operations.get contiene "done": true, response contiene el Key actualizado con las restricciones.

En el siguiente ejemplo, se muestra cómo crear una clave de API nueva que solo permita solicitudes HTTP de una lista de URL específicas.

gcurl https://apikeys.googleapis.com/v2/projects/PROJECT_NUMBER/locations/global/keys \
  --request POST \
  --data '{
    "displayName" : "API key with browser restrictions",
    "restrictions" : {
      "browserKeyRestrictions": {
        "allowedReferrers": ["www.example.com", "www.example-2.com"]
      }
    }
  }'

En la siguiente tabla, se muestran algunas situaciones de ejemplo y restricciones de navegador:

Situación Restricciones
Permitir cualquier URL en tu sitio Debes establecer dos URL en la lista "allowedReferers".
  1. URL del dominio, sin un subdominio y con un comodín en la ruta de acceso Por ejemplo:
    example.com/*
  2. Una segunda URL que incluye un comodín para el subdominio y un comodín para la ruta de acceso Por ejemplo:
    *.example.com/*
Permitir una URL específica Agrega una URL con una ruta de acceso exacta. Por ejemplo:
www.example.com/path
www.example.com/path/path
Permitir cualquier URL en un solo subdominio o dominio simple Debes establecer dos URL en la lista "allowedReferers" para permitir un dominio completo.
  1. URL del dominio sin una barra final Por ejemplo:
    www.example.com
    sub.example.com
    example.com
  2. Una segunda URL para el dominio que incluye un comodín en la ruta de acceso Por ejemplo:
    www.example.com/*
    sub.example.com/*
    example.com/*

Agrega restricciones de servidor

Puedes especificar una o más direcciones IP de los emisores, como los servidores web o los trabajos cron, que pueden usar la clave de API. Puedes especificar las direcciones IP en cualquiera de los siguientes formatos:

  • IPv4 (198.51.100.1)
  • IPv6 (2001:db8::1)
  • Una subred que usa notación CIDR (198.51.100.0/24, 2001:db8::/64)

En el siguiente ejemplo, se muestra cómo crear una clave de API con una lista de allowedIps:

gcurl https://apikeys.googleapis.com/v2/projects/PROJECT_NUMBER/locations/global/keys  \
  --request POST \
  --data  '{
    "displayName" : "API key with server restrictions with IPv4, IPv6 and CIDR",
    "restrictions" : {
      "serverKeyRestrictions": {
        "allowedIps": ["198.51.100.1","198.51.100.0/24","2001:db8::1","2001:db8::/64"]
      }
    }
  }'

Cómo agregar restricciones de Android

Puedes restringir el uso de una clave de API solo a tus apps para Android. Cuando crees o actualices una clave de API, proporciona el nombre del paquete y la huella digital SHA-1 de 20 bytes para cada aplicación.

Por ejemplo, supongamos que ejecutaste la utilidad keytool y que creó la siguiente huella digital:

  Certificate fingerprint: SHA1: DA:39:A3:EE:5E:6B:4B:0D:32:55:BF:EF:95:60:18:90:AF:D8:07:09

En el siguiente ejemplo, se muestra cómo crear una clave de API con la huella digital y el nombre del paquete para androidKeyRestrictions:

gcurl https://apikeys.googleapis.com/v2/projects/PROJECT_NUMBER/locations/global/keys  \
  --request POST \
  --data  '{
    "displayName" : "API key with Android restrictions",
    "restrictions" : {
      "androidKeyRestrictions": {
        "allowedApplications": [
          {
            "sha1Fingerprint": "DA:39:A3:EE:5E:6B:4B:0D:32:55:BF:EF:95:60:18:90:AF:D8:07:09",
            "packageName": "com.example.my.app"
          }
        ]
      }
    }
  }'

Cómo agregar restricciones de iOS

Puedes restringir el uso de una clave de API solo a tus apps para iOS si proporcionas el ID del paquete de cada app cuando creas o actualizas una clave. En el siguiente ejemplo, se muestra cómo configurar iosKeyRestrictions cuando creas una clave de API:

gcurl https://apikeys.googleapis.com/v2/projects/PROJECT_NUMBER/locations/global/keys  \
  --request POST \
  --data  '{
    "displayName" : "API key with iOs restrictions",
    "restrictions" : {
      "iosKeyRestrictions": {
        "allowedBundleIds": ["com.example.my.app1", "com.example.my.app2"]
      }
    }
  }'

Agrega restricciones de API

Las restricciones de la API te permiten especificar a qué API de Google Cloud se puede llamar con la clave de API. Recomendamos que agregues restricciones de cliente y de API a todas tus claves de API.

Puedes especificar uno o más servicios en las restricciones de la API. En el siguiente ejemplo, se muestra cómo restringir el uso de una clave de API nueva solo a los servicios translate.googleapis.com y datastore.googleapis.com:

gcurl https://apikeys.googleapis.com/v2/projects/PROJECT_NUMBER/locations/global/keys  \
  --request POST \
  --data '{
    "restrictions": {
      "api_targets": [
        {
          "service": "translate.googleapis.com"
        },
        {
          "service" : "datastore.googleapis.com"
        }
      ]
    },
  }'

Para obtener una lista de los servicios que están habilitados en tu proyecto de Cloud, usa el comando gcloud services list.

Además de restringir la clave de API para su uso en servicios específicos, puedes especificar de forma opcional los métodos de cada servicio a fin de restringir aún más la clave de API. En el siguiente ejemplo, se muestra cómo restringir la clave anterior a solo los métodos de translate.googleapis.com permitidos:

gcurl https://apikeys.googleapis.com/v2/projects/PROJECT_NUMBER/locations/global/keys/KEY_ID?updateMask=restrictions  \
  --request PATCH \
  --data '{
    "restrictions": {
      "api_targets": [
        {
          "service": "translate.googleapis.com"
          "methods": [
            "Get*",
            "DetectLanguage"
          ]
        },
        {
          "service" : "datastore.googleapis.com"
        }
      ]
    },
    "etag": "ETAG"
  }'

¿Qué sigue?