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 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 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 puedes agregarlas después de que se crea 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.

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 de cliente:

  • browserKeyRestrictions: Son los sitios web de referencia HTTP que pueden usar la clave.
  • serverKeyRestrictions: Son las direcciones IP de los emisores que pueden usar la clave.
  • androidKeyRestrictions: Son las apps para Android que pueden usar la clave.
  • iosKeyRestrictions: Son las apps para iOS que pueden usar la clave.

Agrega restricciones de navegador

En el siguiente ejemplo, se muestra cómo llamar al método UpdateKey para restringir el sitio web de referencia HTTP a www.example.com:

curl -X PATCH \
     -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     -H "Content-Type: application/json; charset=utf-8" \
     -d '{
          "restrictions" : {
            "browserKeyRestrictions": {
              "allowedReferrers": "www.example.com"
            }
          },
          "etag": "ETAG"
        }' \
     'https://apikeys.googleapis.com/v2/projects/PROJECT_NUMBER/locations/global/keys/KEY_ID?updateMask=restrictions'

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

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

curl -X POST \
     -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     -H "Content-Type: application/json; charset=utf-8" \
     -d '{
          "displayName" : "API key with browser restrictions",
          "restrictions" : {
            "browserKeyRestrictions": {
              "allowedReferrers": ["www.example.com", "www.example-2.com"]
            }
          }
        }' \
     'https://apikeys.googleapis.com/v2/projects/PROJECT_NUMBER/locations/global/keys'

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/*

Agrega 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:

curl -X POST \
     -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     -H "Content-Type: application/json; charset=utf-8" \
     -d '{
          "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"]
            }
          }
        }' \
     'https://apikeys.googleapis.com/v2/projects/PROJECT_NUMBER/locations/global/keys'

Agrega restricciones para 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 keytool utilidad 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 en androidKeyRestrictions:

curl -X POST \
     -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     -H "Content-Type: application/json; charset=utf-8" \
     -d '{
          "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"
                }
              ]
            }
          }
        }' \
     'https://apikeys.googleapis.com/v2/projects/PROJECT_NUMBER/locations/global/keys'

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 configurar iosKeyRestrictions cuando se crea una clave de API:

curl -X POST \
     -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     -H "Content-Type: application/json; charset=utf-8" \
     -d '{
          "displayName" : "API key with iOS restrictions",
          "restrictions" : {
            "iosKeyRestrictions": {
              "allowedBundleIds": ["com.example.my.app1", "com.example.my.app2"]
            }
          }
        }' \
     'https://apikeys.googleapis.com/v2/projects/PROJECT_NUMBER/locations/global/keys'

Agrega restricciones de API

Las restricciones de API te permiten especificar qué Google Cloud APIs se pueden 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:

curl -X POST \
     -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     -H "Content-Type: application/json; charset=utf-8" \
     -d '{
          "displayName" : "API key with API restrictions",
          "restrictions": {
            "api_targets": [
              {
                "service": "translate.googleapis.com"
              },
              {
                "service" : "datastore.googleapis.com"
              }
            ]
          },
        }' \
        'https://apikeys.googleapis.com/v2/projects/PROJECT_NUMBER/locations/global/keys'

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

Además de restringir la clave de API para su uso en servicios específicos, también puedes especificar los métodos en 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:

curl -X PATCH \
     -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     -H "Content-Type: application/json; charset=utf-8" \
     -d '{
          "restrictions": {
            "api_targets": [
              {
                "service": "translate.googleapis.com",
                "methods": [
                  "Get*",
                  "DetectLanguage"
                ]
              },
              {
                "service" : "datastore.googleapis.com"
              }
            ]
          },
          "etag": "ETAG"
        }' \
     'https://apikeys.googleapis.com/v2/projects/PROJECT_NUMBER/locations/global/keys/KEY_ID?updateMask=restrictions'

¿Qué sigue?