Añadir restricciones a las claves de API

Las claves de API identifican tu aplicación o sitio web a Google Cloud. Las restricciones de clave de API permiten que solo tus aplicaciones y sitios web puedan usar tus claves. Por motivos de seguridad, te recomendamos que añadas restricciones que especifiquen:

Si un cliente utiliza una clave de API restringida para emitir una solicitud que no cumple 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 se recibe una solicitud HTTP de un dominio diferente, se rechazará la solicitud mediante un error.

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

Antes de empezar

La página utiliza curl con la herramienta de línea de comandos oauth2l para enviar solicitudes a la API de las claves de API. Consulta la página Primeros pasos con las claves de API para obtener información detallada sobre cómo configurar este tipo de experimentos.

Añadir restricciones de cliente

Las restricciones de cliente especifican qué sitios web, direcciones IP o aplicaciones pueden usar una clave de API. Añade restricciones de cliente según el tipo de cliente que llame a tu API. Puede especificar uno de los siguientes tipos de restricciones del cliente:

  • browserKeyRestrictions: las URL de referencia HTTP (sitios web) que pueden usar la clave.
  • serverKeyRestrictions: las direcciones IP de las llamadas que tienen permiso para usar la clave.
  • androidKeyRestrictions: las aplicaciones Android que pueden usar la clave.
  • iosKeyRestrictions: las aplicaciones iOS que pueden usar la clave.

Añadir restricciones de navegador

En el siguiente ejemplo se muestra cómo llamar al método UpdateKey para restringir la referencia 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 elemento Key actualizado con las restricciones.

En el siguiente ejemplo se muestra cómo crear una clave de API 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 algunos ejemplos y restricciones de navegadores:

Situación Restricciones
Permite todas las URL de tu sitio web Debes definir dos URL en la lista "allowedRefersers".
  1. URL del dominio, sin un subdominio, y con un comodín para la ruta. Por ejemplo:
    example.com/*
  2. Es una segunda URL que incluye un comodín para el subdominio y un comodín para la ruta. Por ejemplo:
    *.example.com/*
Permitir una URL concreta Añada una URL con una ruta exacta. Por ejemplo:
www.example.com/path
www.example.com/path/path
Permite todas las URL de un solo subdominio o dominio simple Debes permitir dos URL en la lista "allowedRefersers" para permitir todo un dominio.
  1. URL del dominio, sin barra al final. Por ejemplo:
    www.example.com
    sub.example.com
    example.com
  2. Una segunda URL para el dominio que incluya un comodín para la ruta. Por ejemplo:
    www.example.com/*
    sub.example.com/*
    example.com/*

Añadir restricciones de servidor

Puedes especificar una o varias direcciones IP de las personas que te llaman, como servidores web o tareas cron, que pueden usar tu 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 utiliza la 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"]
      }
    }
  }'

Añadir restricciones de Android

Puedes restringir el uso de una clave de API solo a tus aplicaciones para Android. Al crear o actualizar 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 ha creado 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"
          }
        ]
      }
    }
  }'

Añadir restricciones de iOS

Puedes restringir el uso de una clave de API solo a tus aplicaciones iOS si proporcionas el ID de paquete de cada aplicación cuando creas o actualizas una clave. En el siguiente ejemplo se muestra cómo configurar el objeto iosKeyRestrictions al crear 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"]
      }
    }
  }'

Añadir restricciones de API

Las restricciones de APIs te permiten especificar a qué APIs de Google Cloud se pueden llamar mediante esta clave. Te recomendamos que añadas restricciones de cliente y de API a todas las claves de API.

Puedes especificar uno o varios 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 habilitados en tu proyecto de Cloud, usa el comando gcloud services list.

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

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"
  }'

Siguientes pasos