Autenticarse para usar REST

En esta página se describe cómo autenticarte cuando haces una solicitud REST a una API de Google.

Para obtener información sobre cómo autenticarse al usar bibliotecas de cliente de Google, consulte Autenticar mediante bibliotecas de cliente.

Antes de empezar

Para ejecutar las muestras de esta página, sigue estos pasos:

  1. Install the Google Cloud CLI.

  2. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Enable the Cloud Resource Manager and Identity and Access Management (IAM) APIs:

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    gcloud services enable cloudresourcemanager.googleapis.com iam.googleapis.com

Si no quieres usar la CLI de gcloud, puedes saltarte estos pasos y usar la suplantación de identidad de cuenta de servicio o el servidor de metadatos para generar un token.

Tipos de credenciales

Puede usar los siguientes tipos de credenciales para autenticar una llamada REST:

  • Tus credenciales de gcloud CLI.

    Este es el método más sencillo y seguro de proporcionar credenciales a un método REST en un entorno de desarrollo local. Si tu cuenta de usuario tiene los permisos de gestión de identidades y accesos (IAM) necesarios para el método al que quieres llamar, este es el enfoque preferido.

    Tus credenciales de gcloud no son las mismas que las que proporcionas a ADC mediante gcloud CLI. Para obtener más información, consulta Configuración de autenticación de la CLI de gcloud y configuración de ADC.

  • Las credenciales proporcionadas a las credenciales de aplicación predeterminadas (ADC).

    Este método es la opción preferida para autenticar una llamada REST en un entorno de producción, ya que ADC busca credenciales en el recurso en el que se ejecuta el código (por ejemplo, una máquina virtual de Compute Engine). También puedes usar ADC para autenticarte en un entorno de desarrollo local. En este caso, la CLI de gcloud crea un archivo que contiene tus credenciales en tu sistema de archivos local.

  • Las credenciales proporcionadas al suplantar la identidad de una cuenta de servicio.

    Este método requiere más configuración. Si quieres usar tus credenciales para obtener credenciales de corta duración para otra cuenta de servicio, como hacer pruebas con una cuenta de servicio de forma local o solicitar privilegios elevados temporales, usa este método.

  • Las credenciales devueltas por el servidor de metadatos.

    Este método solo funciona en entornos con acceso a un servidor de metadatos. Las credenciales devueltas por el servidor de metadatos son las mismas que las que encontrarían las credenciales predeterminadas de la aplicación mediante la cuenta de servicio adjunta, pero tú solicitas explícitamente el token de acceso al servidor de metadatos y, a continuación, lo proporcionas con la solicitud REST. Para consultar el servidor de metadatos en busca de credenciales, se necesita una solicitud HTTP GET. Este método no depende de la CLI de Google Cloud.

  • Claves de API

    Solo puedes usar una clave de API con una solicitud REST para las APIs que acepten claves de API. Además, la clave de API no debe estar restringida para que se pueda usar con la API.

Credenciales de la CLI de gcloud

Para ejecutar el siguiente ejemplo, necesitas el permiso resourcemanager.projects.get en el proyecto. El permiso resourcemanager.projects.get se incluye en varios roles, como el rol de navegador (roles/browser).

  1. Usa el comando gcloud auth print-access-token para insertar un token de acceso generado a partir de las credenciales de tu usuario.

    En el siguiente ejemplo se obtienen los detalles del proyecto especificado. Puedes usar el mismo patrón para cualquier solicitud REST.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • PROJECT_ID: el ID o el nombre de tu Google Cloud proyecto.

    Para enviar tu solicitud, elige una de estas opciones:

    curl

    Ejecuta el comando siguiente:

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://cloudresourcemanager.googleapis.com/v3/projects/PROJECT_ID"

    PowerShell

    Ejecuta el comando siguiente:

    $cred = gcloud auth print-access-token
    $headers = @{ "Authorization" = "Bearer $cred" }

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://cloudresourcemanager.googleapis.com/v3/projects/PROJECT_ID" | Select-Object -Expand Content

    Se devuelven los detalles de tu proyecto.

En las APIs que requieren un proyecto de cuota, debes definir uno explícitamente para la solicitud. Para obtener más información, consulta la sección Definir el proyecto de cuota con una solicitud REST de esta página.

credenciales de aplicación predeterminadas

Para ejecutar el siguiente ejemplo, la entidad principal asociada a las credenciales que proporciones a ADC necesita el permiso resourcemanager.projects.get en el proyecto. El permiso resourcemanager.projects.get se incluye en varios roles, como el rol de navegador (roles/browser).

  1. Proporciona las credenciales a ADC.

    Si se ejecuta en un recurso de computación de Google Cloud , no debe proporcionar sus credenciales de usuario a ADC. En su lugar, usa la cuenta de servicio adjunta para proporcionar las credenciales. Para obtener más información, consulta el artículo Configurar ADC para un recurso con una cuenta de servicio asociada.

  2. Usa el comando gcloud auth application-default print-access-token para insertar el token de acceso devuelto por ADC en tu solicitud REST.

    En el siguiente ejemplo se obtienen los detalles del proyecto especificado. Puedes usar el mismo patrón para cualquier solicitud REST.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • PROJECT_ID: el ID o el nombre de tu Google Cloud proyecto.

    Para enviar tu solicitud, elige una de estas opciones:

    curl

    Ejecuta el comando siguiente:

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    "https://cloudresourcemanager.googleapis.com/v3/projects/PROJECT_ID"

    PowerShell

    Ejecuta el comando siguiente:

    $cred = gcloud auth application-default print-access-token
    $headers = @{ "Authorization" = "Bearer $cred" }

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://cloudresourcemanager.googleapis.com/v3/projects/PROJECT_ID" | Select-Object -Expand Content

    Se devuelven los detalles de tu proyecto.

    Si tu solicitud devuelve un mensaje de error que indica que esta API no admite las credenciales de usuario final, consulta Definir el proyecto de cuota con una solicitud REST en esta página.

Cuenta de servicio suplantada

La forma más sencilla de suplantar la identidad de una cuenta de servicio para generar un token de acceso es usar la CLI de gcloud. Sin embargo, si necesitas generar el token de forma programática o no quieres usar la CLI de gcloud, puedes usar la suplantación de identidad para generar un token de corta duración.

Para obtener más información sobre cómo suplantar la identidad de una cuenta de servicio, consulta el artículo Usar la suplantación de identidad de una cuenta de servicio.

  1. Revisa los permisos necesarios.

    • La principal que quieras usar para realizar la suplantación debe tener el permiso iam.serviceAccounts.getAccessToken en la cuenta de servicio suplantada (también llamada cuenta de servicio con privilegios). El permiso iam.serviceAccounts.getAccessToken está incluido en el rol Creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator). Si usas tu cuenta de usuario, debes añadir este permiso aunque tengas el rol Propietario (roles/owner) en el proyecto. Para obtener más información, consulta Configurar los permisos necesarios.
  2. Identifica o crea la cuenta de servicio con privilegios, es decir, la cuenta de servicio cuya identidad vas a usar.

    La cuenta de servicio con privilegios debe tener los permisos necesarios para hacer la llamada al método de la API.

gcloud

  1. Usa el comando gcloud auth print-access-token con la marca --impersonate-service-account para insertar un token de acceso de la cuenta de servicio con privilegios en tu solicitud REST.

En el siguiente ejemplo se obtienen los detalles del proyecto especificado. Puedes usar el mismo patrón para cualquier solicitud REST.

Para ejecutar este ejemplo, la cuenta de servicio que suplantas debe tener el permiso resourcemanager.projects.get. El permiso resourcemanager.projects.get se incluye en varios roles, como el rol de navegador (roles/browser).

Haz las siguientes sustituciones:

  • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios. Por ejemplo, my-sa@my-project.iam.gserviceaccount.com.

  • PROJECT_ID: el ID o el nombre de tu Google Cloud proyecto.

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token --impersonate-service-account=PRIV_SA)" \
    "https://cloudresourcemanager.googleapis.com/v3/projects/PROJECT_ID"

Token de corta duración

Para generar un token de corta duración mediante la suplantación de identidad de una cuenta de servicio, sigue las instrucciones que se indican en Crear un token de acceso de corta duración.

Servidor de metadatos

Para obtener un token de acceso del servidor de metadatos, debes hacer la llamada REST con uno de los servicios que tengan acceso a un servidor de metadatos:

Para obtener un token de acceso, se usa una herramienta de línea de comandos, como curl, y luego se inserta en la solicitud REST.

  1. Consulta el servidor de metadatos para obtener un token de acceso:

    curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" \
        -H "Metadata-Flavor: Google"
    

    La solicitud devuelve una respuesta similar a la del siguiente ejemplo:

    {
          "access_token":"ya29.AHES6ZRN3-HlhAPya30GnW_bHSb_QtAi85nHq39HE3C2LTrCARA",
          "expires_in":3599,
          "token_type":"Bearer"
     }
    
  2. Inserta el token de acceso en tu solicitud REST y haz los siguientes cambios:

    • ACCESS_TOKEN: el token de acceso devuelto en el paso anterior.
    • PROJECT_ID: el ID o el nombre de tu Google Cloud proyecto.
    curl -X GET \
        -H "Authorization: Bearer ACCESS_TOKEN" \
        "https://cloudresourcemanager.googleapis.com/v3/projects/PROJECT_ID"
    

Claves de API

Para incluir una clave de API en una llamada a la API REST, usa el encabezado HTTP x-goog-api-key, como se muestra en el siguiente ejemplo:

curl -X POST \
    -H "X-goog-api-key: API_KEY" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://translation.googleapis.com/language/translate/v2"

Si no puede usar el encabezado HTTP, puede usar el parámetro de consulta key. Sin embargo, este método incluye tu clave de API en la URL, lo que la expone a robos mediante análisis de URLs.

En el siguiente ejemplo se muestra cómo usar el parámetro de consulta key con una solicitud de la API Cloud Natural Language para documents.analyzeEntities. Sustituye API_KEY por la cadena de clave de tu clave de API.

POST https://language.googleapis.com/v1/documents:analyzeEntities?key=API_KEY

Definir el proyecto de cuota con una solicitud REST

Para llamar a algunas APIs con credenciales de usuario, también debes definir el proyecto que se factura por tu uso y que se utiliza para hacer un seguimiento de la cuota. Si tu llamada a la API devuelve un mensaje de error que indica que no se admiten las credenciales de usuario o que no se ha definido el proyecto de cuota, debes definir explícitamente el proyecto de cuota para la solicitud. Para definir el proyecto de cuota, incluye el encabezado x-goog-user-project en tu solicitud.

Para obtener más información sobre cuándo puede producirse este problema, consulta el artículo Las credenciales de usuario no funcionan.

Debes tener el permiso de gestión de identidades y accesos serviceusage.services.use para un proyecto si quieres designarlo como tu proyecto de facturación. El permiso serviceusage.services.use está incluido en el rol de gestión de identidades y accesos Consumidor de uso de servicio. Si no tienes el permiso serviceusage.services.use en ningún proyecto, ponte en contacto con tu administrador de seguridad o con el propietario de un proyecto que pueda asignarte el rol de consumidor de uso de servicios en el proyecto.

En el siguiente ejemplo se usa la API Cloud Translation para traducir la palabra "hello" al español. La API Cloud Translation es una API que necesita que se especifique un proyecto de cuota. Para ejecutar el ejemplo, crea un archivo llamado request.json con el contenido del cuerpo de la solicitud.

Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

  • PROJECT_ID: el ID o el nombre del Google Cloud proyecto que se va a usar como proyecto de facturación.

Cuerpo JSON de la solicitud:

{
  "q": "hello",
  "source": "en",
  "target": "es"
}

Para enviar tu solicitud, elige una de estas opciones:

curl

Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "x-goog-user-project: PROJECT_ID" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://translation.googleapis.com/language/translate/v2"

PowerShell

Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred"; "x-goog-user-project" = "PROJECT_ID" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://translation.googleapis.com/language/translate/v2" | Select-Object -Expand Content

La solicitud de traducción se realiza correctamente. Puedes probar el comando sin el encabezado HTTP x-goog-user-project para ver qué ocurre cuando no especificas el proyecto de facturación.

Siguientes pasos