En esta página, se describe cómo autenticar un recurso protegido con Identity-Aware Proxy (IAP) desde una cuenta de usuario o una cuenta de servicio.
Una cuenta de usuario pertenece a un usuario individual. Debes autenticarla cuando tu aplicación requiera acceso a recursos protegidos con IAP en nombre de un usuario. Para obtener más información, consulta Cuentas de usuario.
Una cuenta de servicio pertenece a una aplicación y no a un usuario individual. Debes autenticarla cuando desees permitir que una aplicación acceda a tus recursos protegidos con IAP. Para obtener más información, consulta Cuentas de servicio.
Antes de comenzar
Necesitarás lo siguiente antes de comenzar:
- Una aplicación protegida con IAP a la que deseas conectarte de manera programática con una cuenta de desarrollador, una cuenta de servicio o credenciales de aplicación para dispositivos móviles.
Autentica una cuenta de usuario
Puedes permitir que los usuarios accedan a tu aplicación, desde una app para dispositivos móviles o de escritorio, de tal forma que el programa interactúe con un recurso protegido con IAP.
Autenticación desde una aplicación para dispositivos móviles
- Crea un ID de cliente de OAuth 2.0 para tu aplicación para dispositivos móviles en el mismo proyecto que el recurso protegido con IAP:
- Ve a la página Credenciales.
Ir a la página Credenciales - Selecciona el proyecto con el recurso protegido con IAP.
- Haz clic en Crear credenciales y, luego, selecciona ID de cliente de OAuth.
- Selecciona el tipo de aplicación para la que quieres crear credenciales.
- Agrega un Nombre y Restricciones si corresponden y, luego, haz clic en Crear.
- Ve a la página Credenciales.
- En la ventana Cliente de OAuth que aparece, toma nota del ID de cliente del recurso protegido con IAP al que deseas conectarte.
- Obtén un token de ID para el ID de cliente protegido con IAP:
- Android: Usa la API de Acceso con Google para solicitar un token de OpenID Connect (OIDC). Establece el ID de cliente
requestIdToken
en el ID de cliente del recurso al que te estás conectando. - iOS: Usa el Acceso con Google para obtener un token de ID. Configura
serverClientID
con el ID de cliente del recurso al que te estás conectando.
- Android: Usa la API de Acceso con Google para solicitar un token de OpenID Connect (OIDC). Establece el ID de cliente
- Incluye el token de ID en un encabezado
Authorization: Bearer
a fin de realizar la solicitud autenticada para el recurso protegido con IAP.
Autenticación desde una aplicación de escritorio
En esta sección se describe cómo autenticar una cuenta de usuario desde una línea de comandos de escritorio.
Configuración del ID de cliente
Para permitir que los desarrolladores accedan a tu aplicación desde la línea de comandos, primero deberás crear credenciales para el ID de cliente de OAuth del tipo app de escritorio:
- Ve a la página Credenciales.
Ir a la página Credenciales - Selecciona el proyecto con el recurso protegido con IAP.
- Haz clic en Crear credenciales y selecciona ID de cliente de OAuth.
- En Tipo de aplicación, selecciona App de escritorio, agrega un Nombre y, a continuación, haz clic en Crear.
- En la ventana del cliente OAuth que aparece a continuación, toma nota del ID de cliente y del secreto del cliente. Los necesitarás en una secuencia de comandos para poder administrar las credenciales o compartirlos con los desarrolladores.
- En la ventana Credenciales, podrás ver tus nuevas credenciales de App de escritorio junto con el ID de cliente principal que se utiliza para acceder a tu aplicación.
Accede a la aplicación
Todos los desarrolladores que quieran tener acceso a una aplicación protegida con IAP deberán primero acceder. Puedes empaquetar el proceso en una secuencia de comandos, por ejemplo, mediante gcloud CLI. A continuación se muestra un ejemplo del uso de curl para ingresar y generar un token que se puede usar a fin de acceder a la aplicación:
- Acceda a su cuenta que tiene acceso al recurso de Google Cloud.
-
Inicia un servidor local que pueda reproducir las solicitudes entrantes.
$ nc -k -l 4444
NOTA: El comando usa la utilidad NetCat. Puedes usar la utilidad que prefieras. -
Ve al siguiente URI, en el que
DESKTOP_CLIENT_ID
es el ID de cliente de la app de escritorio que creaste antes:https://accounts.google.com/o/oauth2/v2/auth?client_id=DESKTOP_CLIENT_ID&response_type=code&scope=openid%20email&access_type=offline&redirect_uri=http://localhost:4444&cred_ref=true
-
En el resultado del servidor local, busca los parámetros de la solicitud. Deberías ver algo como lo siguiente:
GET /?code=$CODE&scope=email%20openid%20https://www.googleapis.com/auth/userinfo.email&hd=google.com&prompt=consent HTTP/1.1
Copia el CÓDIGO para reemplazarAUTH_CODE
a continuación junto con el ID de cliente y el secreto de cliente de la app de escritorio que creaste anteriormente.IAP_CLIENT_ID
es el ID de cliente principal que se usa para acceder a tu aplicación:curl --verbose \ --data client_id=DESKTOP_CLIENT_ID \ --data client_secret=DESKTOP_CLIENT_SECRET \ --data code=AUTH_CODE \ --data audience=IAP_CLIENT_ID \ --data redirect_uri=http://localhost:4444 \ --data grant_type=authorization_code \ https://oauth2.googleapis.com/token
Este código muestra un objeto JSON con un campo
id_token
que puedes usar para acceder a la aplicación.
Accede a la aplicación
Para acceder a la app, usa id_token
de la siguiente manera:
curl --verbose --header 'Authorization: Bearer ID_TOKEN' URL
Token de actualización
Puedes usar el token de actualización que se generó durante el flujo de acceso para obtener nuevos tokens de ID. Esto es útil cuando vence el token de ID original. Cada token de ID es válido durante aproximadamente una hora, durante la cual puedes realizar varias solicitudes a una app específica.
El siguiente es un ejemplo en el que se usa curl para usar el token de actualización a fin de obtener un token de ID nuevo. En el siguiente ejemplo, REFRESH_TOKEN
es el token del flujo de acceso.
IAP_CLIENT_ID
,
DESKTOP_CLIENT_ID
y
DESKTOP_CLIENT_SECRET
son los
mismo que se usan en el flujo de acceso:
curl --verbose \ --data client_id=DESKTOP_CLIENT_ID \ --data client_secret=DESKTOP_CLIENT_SECRET \ --data refresh_token=REFRESH_TOKEN \ --data grant_type=refresh_token \ --data audience=IAP_CLIENT_ID \ https://oauth2.googleapis.com/token
Este código muestra un objeto JSON con un nuevo campo id_token
que puedes usar para acceder a la aplicación.
Autenticación desde una cuenta de servicio
Usa un token de OpenID Connect (OIDC) para autenticar una cuenta de servicio en un recurso protegido con IAP. Sigue estos pasos para encontrar tu ID de cliente:
- Ve a la página de IAP.
Busca el recurso al que deseas acceder y, luego, haz clic en > Ir a la configuración de OAuth.
En la página que aparece, toma nota del ID de cliente. Puedes cambiar el ID de cliente de un servicio de backend con el comando
gcloud compute backend-services update
.gcloud compute backend-services update BACKEND_SERVICE_NAME \ --iap='enabled,oauth2-client-id=OAUTH_CLIENT_ID,oauth2-client-secret=OAUTH_CLIENT_SECRET'
Reemplaza lo siguiente:
-
BACKEND_SERVICE_NAME
: Es el nombre de la cuenta de servicio de backend. -
OAUTH_CLIENT_ID
: Es el nuevo ID de cliente de OAuth. -
OAUTH_CLIENT_SECRET
: Es el secreto del cliente de OAuth nuevo.
-
También debes agregar la cuenta de servicio a la lista de acceso del proyecto protegido con IAP. En las siguientes muestras de código, se indica cómo obtener un token de OIDC. Sin importar el que elijas, debes incluir el token en un encabezado Authorization: Bearer
para realizar la solicitud autenticada al recurso protegido con IAP.
Obtén un token de OIDC para la cuenta de servicio predeterminada
Si deseas obtener un token de OIDC para la cuenta de servicio predeterminada de Compute Engine, App Engine o Cloud Run, puedes usar el siguiente código de muestra a fin de generar el token para acceder a un recurso protegido con IAP:
C#
Go
Para autenticar en IAP, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Java
Node.js
PHP
Para autenticar en IAP, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Python
Para autenticar en IAP, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Ruby
Para autenticar en IAP, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Obtén un token de OIDC de un archivo de claves de cuenta de servicio local
Si tienes un archivo de claves de cuenta de servicio, puedes adaptar las muestras de código anteriores para proporcionar el archivo de claves de cuenta de servicio.
Bash
#!/usr/bin/env bash
set -euo pipefail
get_token() {
# Get the bearer token in exchange for the service account credentials.
local service_account_key_file_path="${1}"
local iap_client_id="${2}"
local iam_scope="https://www.googleapis.com/auth/iam"
local oauth_token_uri="https://www.googleapis.com/oauth2/v4/token"
local private_key_id="$(cat "${service_account_key_file_path}" | jq -r '.private_key_id')"
local client_email="$(cat "${service_account_key_file_path}" | jq -r '.client_email')"
local private_key="$(cat "${service_account_key_file_path}" | jq -r '.private_key')"
local issued_at="$(date +%s)"
local expires_at="$((issued_at + 3600))"
local header="{'alg':'RS256','typ':'JWT','kid':'${private_key_id}'}"
local header_base64="$(echo "${header}" | base64)"
local payload="{'iss':'${client_email}','aud':'${oauth_token_uri}','exp':${expires_at},'iat':${issued_at},'sub':'${client_email}','target_audience':'${iap_client_id}'}"
local payload_base64="$(echo "${payload}" | base64)"
local signature_base64="$(printf %s "${header_base64}.${payload_base64}" | openssl dgst -binary -sha256 -sign <(printf '%s\n' "${private_key}") | base64)"
local assertion="${header_base64}.${payload_base64}.${signature_base64}"
local token_payload="$(curl -s \
--data-urlencode "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer" \
--data-urlencode "assertion=${assertion}" \
https://www.googleapis.com/oauth2/v4/token)"
local bearer_id_token="$(echo "${token_payload}" | jq -r '.id_token')"
echo "${bearer_id_token}"
}
main(){
# TODO: Replace the following variables:
SERVICE_ACCOUNT_KEY="service_account_key_file_path"
IAP_CLIENT_ID="iap_client_id"
URL="application_url"
# Obtain the ID token.
ID_TOKEN=$(get_token "${SERVICE_ACCOUNT_KEY}" "${IAP_CLIENT_ID}")
# Access the application with the ID token.
curl --header "Authorization: Bearer ${ID_TOKEN}" "${URL}"
}
main "$@"
Obtén un token de OIDC en todos los demás casos
En todos los demás casos, usa la API de credenciales de IAM para generar un token de OIDC mediante el robo de la identidad de una cuenta de servicio de destino justo antes de acceder a un recurso protegido con IAP. Este proceso implica los siguientes pasos:
Proporciona a la cuenta de servicio que realiza la llamada (la cuenta de servicio asociada con el código que obtiene el token de ID) la función de creador de tokens de identidad de OpenID de la cuenta de servicio (
roles/iam.serviceAccountOpenIdTokenCreator
).Esto permite que la cuenta de servicio que realiza la llamada pueda actuar en nombre de la cuenta de servicio de destino.
Usa las credenciales que proporciona la cuenta de servicio de llamadas para llamar al método generateIdToken en la cuenta de servicio de destino.
Establece el campo
audience
en tu ID de cliente.
Para obtener instrucciones paso a paso, consulta Crea un token de ID.
Autenticación desde un encabezado de autorización de proxy
Si tu aplicación ocupa el encabezado de la solicitud Authorization
, puedes incluir el token de ID en un encabezado Proxy-Authorization: Bearer
. Si se encuentra un token de ID válido en un encabezado Proxy-Authorization
, IAP autoriza la solicitud con él. Después de autorizar la solicitud, IAP pasa el encabezado Authorization
a tu aplicación sin procesar el contenido.
Si no se encuentra un token de ID válido en el encabezado Proxy-Authorization
, IAP continúa procesando el encabezado Authorization
y quita el encabezado Proxy-Authorization
antes de pasar la solicitud a tu aplicación.
¿Qué sigue?
- Obtén más información sobre el token del portador de autorización.
- Intenta acceder a Android o acceder a iOS.