Agrega restricciones a las claves de API

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

Si un cliente usa una clave de API restringida para enviar una solicitud que no satisface las restricciones de la clave de API, la solicitud fallará. 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 desde un dominio diferente, la solicitud se rechazará con un error.

Puedes agregar restricciones cuando creas una clave de API con el método CreateKey o 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 muestra cómo agregarlas.

Antes de comenzar

En la página, se usan curl y Google Cloud CLI para enviar solicitudes a la API de API Keys. Consulta Introducción a la API de claves de API para obtener detalles sobre cómo configurar tu entorno y experimentar con la API.

Cómo agregar 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: Son los referentes HTTP (sitios web) que pueden usar la clave.
  • serverKeyRestrictions: Son las direcciones IP de los llamantes que pueden usar la clave.
  • androidKeyRestrictions: Son las apps para Android que pueden usar la clave.
  • iosKeyRestrictions: Las apps para iOS que pueden usar la clave.

Cómo agregar restricciones de navegador

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

En el siguiente ejemplo, se muestra cómo crear una clave de API nueva que solo permita solicitudes HTTP desde una lista de URLs 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 de situaciones y restricciones de navegador:

Situación Restricciones
Permitir cualquier URL en tu sitio Debes establecer dos URLs en la lista allowedReferers.
  1. Es la URL para el 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. Por ejemplo:
    *.example.com/*
Permite 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 URLs en la lista “allowedReferers” para permitir un dominio completo.
  1. Es la URL del dominio sin una barra diagonal 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/*

Cómo agregar restricciones de servidor

Puedes especificar una o más direcciones IP de los emisores, por ejemplo, los servidores web o los trabajos 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 con 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 app.

Por ejemplo, supongamos que ejecutaste la utilidad keytool y esta 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 en 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"
          }
        ]
      }
    }
  }'

Agrega restricciones para 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 establecer iosKeyRestrictions cuando se crea 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 API te permiten especificar a qué Google Cloud APIs se puede llamar con la clave de API. Te 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 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 proyectoGoogle Cloud , usa el comando gcloud services list.

Además de restringir el uso de la clave de API a servicios específicos, también 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 solo a 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"
  }'

¿Qué sigue?